C#学生成绩硬币分配问题求助:GetCoins方法逻辑错误排查
硬币分配算法问题排查
问题场景
给定N名学生及其成绩,分配硬币规则为:成绩高于邻居的学生必须获得比该邻居更多的硬币。
输入示例:3名学生成绩依次为9、10、8,正确输出应为:
Ionel 1
Mihai 3
Elena 1
但现有代码输出中Mihai的硬币数为2,不符合预期,问题出在GetCoins方法。
原代码问题分析
原GetCoins方法的单次遍历逻辑无法正确处理中间元素同时高于左右邻居的场景:
- 单次遍历中处理右边邻居时逻辑混乱,错误修改左侧元素,导致中间元素的硬币数未被正确累加。
- 未考虑双向依赖关系:左右邻居的硬币数会互相影响,单次遍历无法覆盖所有规则场景。
修正后的GetCoins方法
正确思路是通过两次遍历确保所有依赖关系被处理:
- 从左到右遍历:保证每个比左侧成绩高的学生,硬币数比左侧多1
- 从右到左遍历:保证每个比右侧成绩高的学生,硬币数比右侧多1(仅当当前硬币数不满足规则时更新)
修正后的代码:
static int[] GetCoins(int[] input) { int[] coins = new int[input.Length]; // 初始化所有学生至少获得1枚硬币 for (int i = 0; i < coins.Length; i++) { coins[i] = 1; } // 从左到右遍历:处理当前学生成绩高于左侧的情况 for (int i = 1; i < input.Length; i++) { if (input[i] > input[i - 1]) { coins[i] = coins[i - 1] + 1; } } // 从右到左遍历:处理当前学生成绩高于右侧的情况 for (int i = input.Length - 2; i >= 0; i--) { if (input[i] > input[i + 1] && coins[i] <= coins[i + 1]) { coins[i] = coins[i + 1] + 1; } } return coins; }
额外输入逻辑修正
原Main方法存在输入读取错误:
// 原错误代码:误用读取名字的FillArray方法读取成绩 int[] studentsGrades = ConvertList(FillArray(number)); // 修正为:调用专门读取成绩的GetGrades方法 int[] studentsGrades = GetGrades(number);
否则会把成绩当作名字读取,后续类型转换可能引发异常。
内容的提问来源于stack exchange,提问作者BogdanNetan
相关产品推荐
相关产品推荐

