C# .NET 5.0 实现数组取第二大元素出现数组越界错误求解
错误触发原因
你代码中第二个for循环的终止条件为i < input.Length,当循环变量i等于input.Length - 1时,代码中input[i + 1]的下标取值为input.Length,超出了C#数组的合法索引范围(数组下标从0开始,最大合法值为数组长度减1),因此必然触发数组越界异常。
同时你当前的遍历逻辑无法实现“提取去重后第二大元素”的需求,即使修复越界问题也无法得到预期输出。
修复后完整代码
using System; namespace second_largest { class Program { static void Main(string[] args) { // 读取输入并转换为double数组 double[] input = Array.ConvertAll(Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries), Convert.ToDouble); // 兼容输入元素不足的情况 if (input.Length < 2) { Console.WriteLine("输入元素数量不足"); return; } // 冒泡排序从大到小排列 for (int repeat = 0; repeat < input.Length; repeat++) { for (int j = 0; j < input.Length - 1; j++) { if(input[j] < input[j+1]) { double temp = input[j]; input[j] = input[j + 1]; input[j + 1] = temp; } } } // 查找去重后的第二大元素 int distinctCount = 1; for (int i = 0; i < input.Length - 1; i++) { if (input[i] != input[i + 1]) { distinctCount++; if (distinctCount == 2) { Console.WriteLine(input[i + 1]); return; } } } // 所有元素都相同的情况 Console.WriteLine("所有输入元素值相同,无第二大元素"); } } }
核心修改点
- 调整第二个遍历循环的终止条件为
i < input.Length - 1,从根源避免访问i + 1时越界 - 新增去重计数逻辑,遍历过程中每遇到不同的值就计数+1,计数到2时对应的元素就是去重后的第二大值,输出后直接终止程序
- 新增输入边界兼容逻辑,处理输入元素不足2个、所有元素值完全相同的异常场景
- 优化输入分割逻辑,新增
StringSplitOptions.RemoveEmptyEntries参数,避免连续空格导致转换失败
内容的提问来源于stack exchange,提问作者Mical -
相关产品推荐
相关产品推荐

