如何编写Java程序统计数组连续数字个数并修复数组越界错误
数组越界原因
- 你在代码中访问
nums[j+1]时没有做边界校验:当j的值等于数组最大下标nums.length - 1时,j+1就超出了数组的合法索引范围(数组索引从0开始,最大为长度减1),直接触发越界异常 - 内层循环的结束条件
j < nums.length - i逻辑错误,且完全不需要嵌套两层循环实现该需求,对新手来说单循环的逻辑更简单易懂
逻辑问题说明
原有代码就算修复了越界问题也无法正常输出结果:
- 连续数字的计数逻辑错误,
nums[j+1]==counter的判断和需求毫无逻辑关联 - 嵌套循环的设计完全不符合需求场景,会出现重复计数的问题
新手友好的简化实现
你已经做对了第一步:先给数组排序,排序后连续的数字必然是相邻的,只需要一次遍历就能统计出最长连续数字的个数,实现逻辑非常好懂:
import java.util.Arrays; class Main { public static void main(String[] args) { System.out.println("最长连续数字的个数为:" + countConsecutive()); } static int countConsecutive() { int[] nums = {16, 4, 5, 200, 6, 7, 70, 8}; // 空数组直接返回0 if (nums.length == 0) { return 0; } // 先排序,排序后连续数字必然相邻 Arrays.sort(nums); // 输出排序后的数组 System.out.println("排序后的数组:"); for (int i = 0; i < nums.length; i++) { if (i != nums.length - 1) { System.out.print(nums[i] + ", "); } else { System.out.println(nums[i]); } } // 当前连续序列长度,最少为1(单个元素本身就是长度为1的序列) int currentCount = 1; // 记录最长的连续序列长度 int maxCount = 1; // 从第二个元素开始和前一个对比 for (int i = 1; i < nums.length; i++) { // 跳过重复元素,比如两个相同的7不算连续 if (nums[i] == nums[i-1]) { continue; } // 当前元素比前一个大1,连续序列长度加1 if (nums[i] == nums[i-1] + 1) { currentCount++; // 更新最长长度 if (currentCount > maxCount) { maxCount = currentCount; } } else { // 连续序列中断,重置当前连续长度 currentCount = 1; } } return maxCount; } }
运行你给出的示例数组{1,8,10,4,2,3},会输出结果4,完全符合需求。
内容的提问来源于stack exchange,提问作者Jasper Atrens
相关产品推荐
相关产品推荐

