Java如何统计数组输入值次数并找出出现次数最少的最小数值
问题代码错误分析及修复
原代码存在的问题
- 计数器数组长度设置错误:输入数字范围是1100,原代码将counter数组长度设为n,当输入数字大于等于n时会直接触发数组越界异常,正确长度应设为101(覆盖下标0100,忽略未使用的下标0即可)
- 遍历查找答案的循环边界错误:原代码用统计得到的最大出现次数
max作为数字遍历的上限,完全不符合逻辑,数字的遍历范围应为1~100 - 冗余逻辑:统计最大出现次数
max的代码段对实现「找出现次数最少的数字」没有任何作用,可直接删除
修正后的完整代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int ans = -1; // 计数器数组长度设为101,适配1~100的输入数字 int[] counter = new int[101]; for (int i = 0; i < n; i++) { int num = scanner.nextInt(); counter[num] += 1; } // 遍历1~100所有可能的输入数字,找符合要求的结果 for (int i = 1; i <= 100; i++) { if (counter[i] > 0) { // 首次赋值、当前数字出现次数更少、次数相同但数字更小三种情况更新结果 if (ans == -1 || counter[i] < counter[ans] || (counter[i] == counter[ans] && i < ans)) { ans = i; } } } System.out.print(ans); scanner.close(); } }
关键逻辑说明
遍历1~100的数字时,因为是从小到大遍历,其实可以简化判断条件:当遇到出现次数比当前结果更少的数字时更新结果即可,相同出现次数的数字因为先遍历到更小的,后续相同次数的更大数字不会触发更新,天然满足次数相同时取更小值的要求。
内容的提问来源于stack exchange,提问作者fa za
相关产品推荐
相关产品推荐

