Java实现findMinimum查找数组最小值部分用例失败排查
数组最小值查找方法代码故障分析
需求说明
实现int findMinimum(int[] arr)方法,完整遍历传入的整型数组,查找并返回数组中的最小数值。
- 方法签名:
int findMinimum(int[] arr) - 示例输入:
arr = {9, 2, 3, 6} - 示例输出:
2
提交的问题代码
class CheckMinimum { public static int findMinimum(int[] arr) { int temp= arr[0]; for(int i=0; i<arr.length; i++){ if(temp< arr[i+1]) return temp; else temp= arr[i+1]; } return temp; } public static void main(String args[]) { int[] arr = {4,5,0,3,6}; System.out.print("Array : "); for(int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); System.out.println(); int min = findMinimum(arr); System.out.println("Minimum in the Array: " + min); } }
故障表现
代码在部分测试用例下可返回正确结果,但运行测试用例findMinimum([4,5,0,3,6])时输出不符合预期:预期返回值为0,实际返回值为4。调整最小值0在数组中的位置后,代码偶尔能返回正确结果。
错误根因
代码存在两个致命逻辑错误:
- 循环内提前返回,未完成全数组遍历
代码的判断逻辑是:只要当前记录的临时值temp小于下一个位置的元素,就立刻返回temp,完全终止遍历。在测试用例[4,5,0,3,6]中,temp初始值为数组首元素4,第一次循环i=0时,对比的元素是arr[1]=5,此时判断4 < 5成立,直接返回4,数组后续的0、3、6三个元素根本没有被遍历到,自然无法找到真正的最小值。
所谓“调整0的位置代码就能正常运行”,本质是刚好最小值出现在触发提前return的判断之前,属于巧合,逻辑本身不成立。 - 存在数组下标越界隐患
循环的终止条件是i < arr.length,但循环内部访问的元素是arr[i+1],当i遍历到最后一个位置i = arr.length - 1时,i+1 = arr.length,已经超出数组下标的合法范围(数组合法下标范围是0到arr.length-1),会直接抛出ArrayIndexOutOfBoundsException。之前的测试用例没有触发这个错误,只是因为提前return在循环第一次迭代就退出了,没走到i更大的场景。
修正后实现
正确的逻辑是遍历完数组所有元素,逐个和当前记录的最小值对比,发现更小值就更新记录,等全部元素遍历完成后再返回结果,不要在循环中途返回。修正后的方法如下:
public static int findMinimum(int[] arr) { // 增加空数组边界判断,避免初始赋值报错 if (arr == null || arr.length == 0) { throw new IllegalArgumentException("传入数组不能为空"); } int min = arr[0]; // 从下标1开始遍历所有元素,不需要偏移访问i+1 for(int i = 1; i < arr.length; i++){ if (arr[i] < min) { min = arr[i]; } } return min; }
内容的提问来源于stack exchange,提问作者Mr.Frog
相关产品推荐
相关产品推荐

