我有n个输入。这些输入是1到100之间的数字。我想输出看起来比其他数小的那个数;同样,如果有两个数字具有相同的外观量,我想输出比另一个小的数字。我写了这段代码,但它不工作!
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt(), max=0 , ans=-1;
int[] counter = new int[n];
for(int i=0; i<n; i++)
counter[scanner.nextInt()]+=1;
for(int j=1; j<=100; j++){
if(counter[j]>max)
max=counter[j];
}
for (int i=1; i<=max; i++){
if(counter[i]>0)
if(ans==-1 || counter[ans]>counter[i] || (counter[ans] == counter[i] && i<ans))
ans=i;
}
System.out.print(ans);
你的代码有几个问题,但主要的一个是最后一个for
循环:你试图找到第一个(即最低)的数字,其计数器等于max
,所以你的循环应该从1到n,而不是1到max。
另一个问题是,如果你使用1-n范围内的数字作为数组索引,你需要一个大小为n+1的数组,而不是n。
我从另一个关于你的标题的问题中抓取了这个:
i = input。nextInt ();While (i != 0) {counts [i]++;I =输入。nextInt ();}该方法在counts数组中增加用户输入位置的数字,这样数组就保存了一个数字在特定索引中出现的次数,例如counts保存了3出现的频率。
counter
数组应包含从1到100的数字的频率值。
也就是说,在计算频率时应该使用移位1:
int[] counter = new int[100];
for (int i = 0; i < n; i++) {
counter[scanner.nextInt() - 1]++;
}
或101可以用作counter
数组的长度,从而表示[0..100]
范围内的值,而不移动1。
int[] counter = new int[101];
for (int i = 0; i < n; i++) {
counter[scanner.nextInt()]++;
}
- 可以在单个循环中找到最小最小频率数(假设
counter
长度为101)。
int minFreq = 101, answer = -1;
for(int j = 1; j <= 100; j++) {
if (counter[j] > 0 && counter[j] < minFreq) { // check valid frequency > 0
minFreq = counter[j];
answer = j;
}
}
System.out.println(answer);
- 对于相对较小的计数的更大范围的输入值(例如包括负值),最好使用hashmap而不是大型稀疏数组。