Java不依赖内置类库查找数组最值索引的代码错误排查
问题根因
你的计数逻辑和索引获取的需求完全不匹配:
- 你当前
countsmall、countlarge的累加规则是遇到不等于最值的元素就+1,最终得到的结果是数组中非最小值、非最大值的元素总数,根本不是最值对应的下标。 - 就算数组里的最值没有重复值,这个逻辑算出来的结果也只是「最值前面有多少个其他元素」,一旦数组存在重复的最值、或者最值位置不符合连续计数的预期,结果必然错误。
无内置类库的实现方案
不需要两次遍历数组,也不需要用额外计数变量绕弯,直接在遍历找最值的时候同步记录下标即可,逻辑更简单效率更高:
- 初始化时将最小值、最大值的初始值设为数组首元素,对应的最小值索引
minIdx、最大值索引maxIdx初始值都设为0 - 从数组下标1开始遍历(下标0已经作为初始参照,不需要重复比较)
- 每遍历到一个元素:
- 若当前元素小于已记录的最小值,更新最小值,同时将
minIdx设为当前遍历的下标 - 若当前元素大于已记录的最大值,更新最大值,同时将
maxIdx设为当前遍历的下标
- 若当前元素小于已记录的最小值,更新最小值,同时将
- 遍历结束后直接返回由
minIdx、maxIdx组成的数组即可
修正后的可运行代码如下:
public class practice { public int[] minMax(int[] num) { // 初始化最值和对应索引,首元素为初始参照 int smallest = num[0]; int largest = num[0]; int minIdx = 0; int maxIdx = 0; // 单次遍历同步更新最值和索引 for (int i = 1; i < num.length; i++){ if (num[i] < smallest) { smallest = num[i]; minIdx = i; } if (num[i] > largest) { largest = num[i]; maxIdx = i; } } // 返回的数组第一个元素是最小值索引,第二个是最大值索引 return new int[]{minIdx, maxIdx}; } }
补充说明:如果需求是要找到所有最值对应的索引(比如数组有多个重复的最小值/最大值时返回全部下标),只需要在遍历完拿到最值后,再做一次遍历,把所有等于最值的下标存到对应数组里返回即可,不需要用错位的计数逻辑凑结果。
内容的提问来源于stack exchange,提问作者blackpanther
相关产品推荐
相关产品推荐

