如何获取数组中三个最大整数的索引?求Java代码修复方案
解决你的Top3分数数组问题
嘿,我看你想从scores数组里提取三个最高分数,但当前代码返回的[1,1,0]明显不对,咱们来一步步捋清楚问题出在哪,再给你修正方案:
你的代码里的核心问题:
- 数组没真正复制:
int[] copy = scores;这行只是让copy和scores指向同一个数组,不是创建新副本。你改copy的时候原数组也会被改,这会搞乱后续的最大值查找。 - 循环次数不够:外层循环
for (int i = 1; i != 3; i++)只跑2次(i=1和i=2),所以out的第三个位置(索引2)一直是默认的0,这就是结果里最后那个0的由来。 - 存错了内容:你把队伍编号
j存进out了,但你要的是分数啊!应该存对应的分数值,不是队伍号。 - 数组下标错误:
copy[biggest] = 0;这里biggest是队伍号(比如1),但数组下标从0开始,得写成copy[biggest - 1]才行,不然要么改错位置,要么直接数组越界报错。
修正后的可行代码:
import java.util.Arrays; // 别忘了导入Arrays类,用copyOf的时候需要 public int getScore(int teamnumber) { // scores = [100, 25, 55, 15, 17] return this.scores[teamnumber - 1]; } public int[] top3() { // 真正复制原数组,避免修改原数据 int[] copy = Arrays.copyOf(scores, scores.length); int[] out = new int[3]; // 循环3次,每次找当前最大值存入out for (int i = 0; i < 3; i++) { int maxIndex = 0; // 记录当前最大值的下标 // 遍历副本找最大值 for (int j = 1; j < copy.length; j++) { if (copy[j] > copy[maxIndex]) { maxIndex = j; } } // 把最大值放进结果数组 out[i] = copy[maxIndex]; // 把已经找到的最大值设为0(因为你的分数都是正数),防止重复选中 copy[maxIndex] = 0; } return out; // 现在会返回 [100, 55, 25],完全符合你的需求 }
额外的优化思路:
如果你的分数可能出现负数,那把找到的最大值设为Integer.MIN_VALUE会更靠谱,而不是0。另外,也可以用排序的方式来实现,代码更简洁:
import java.util.Arrays; public int[] top3() { int[] copy = Arrays.copyOf(scores, scores.length); Arrays.sort(copy); // 升序排序 // 取排序后的最后三个元素(最大的三个),倒序放进结果数组 int[] out = {copy[copy.length-1], copy[copy.length-2], copy[copy.length-3]}; return out; }
这样两种方式都能得到你想要的三个最高分数数组啦!
内容的提问来源于stack exchange,提问作者Natieboyy
相关产品推荐
相关产品推荐

