Java – 在排序数组中查找最不常见的整数
为家庭作业分配了一个编程问题,我处于停滞状态。 我今天搜索了几个小时试图找到答案,似乎从来没有在这里问过。 我基本上需要找到数组模式的反转。 以下是我被要求找到解决方案的问题:
LeastFrequent – 从System.in输入的10个整数的列表中输出最不频繁出现的整数及其出现次数。 如果列表中的多个整数出现频率最低,则输出最不频繁出现的任何整数。 将你的class级命名为LeastFrequent。 您可以假设所有10个整数都在-100到100之间。
这是我到目前为止的代码:
package leastfrequent; import java.util.*; public class LeastFrequent { private static int[] arr = new int[10]; private static int minValue; private static int minCount; public static void leastCommon() { for(int i = 0; i < arr.length; i++) { int count = 0; for(int j = 0; j minCount) { minCount = count; minValue = arr[i]; } } } public static void main(String[] args) { Scanner stdin = new Scanner(System.in); System.out.print("numbers: "); for(int i = 0; i < arr.length; i++) { arr[i] = stdin.nextInt(); } Arrays.sort(arr); leastCommon(); System.out.println("least frequent: " + minValue + " occurs " + minCount + " times"); } }
基本上我想,如果我能找到模式,我可以反转该算法并找到最不常见的,但这不起作用,因为它总是读为零。
有没有人有任何想法?
请帮忙!!
两个变化:
-
初始化具有最大索引的
minCount
,即10:private static int minCount = 10;
-
将
if
更改为less than
比较greater than
:if(count < minCount){
这样,无论何时收到较低的出现次数,您都会以较低的计数更改minCount
,最后,它将具有最少的次数。
我想,rest很好。 希望这可以修复你的程序。
您可以使用长度为201的辅助数组,因为您的范围是[-100,100]。
int[] counters = new int[201];
假设用户输入-59,递增该特定计数器:(你应该在输入的数字上加100以找到索引,想想-100在索引0处)
counters[-59 + 100]++;
然后迭代计数器数组并找到最小的非零元素。 从该索引中减去100,这肯定是最不常见的数字。
int min = Integer.MIN_VALUE; for(int i: counters) { if(i != 0 && i < min) min = i; }
现在,这意味着counters[i]
出现频率最低,其对应于实际值(i-100)
。
想想你如何用笔和纸做这件事。
- 计算每个数字在数组中出现的次数。
- 找到最小的数量。
- 返回与该计数对应的值。 这要求您以某种方式存储映射到其计数的值。
arrays排序的事实允许您通过查找相同数字的最短连续运行来优化此算法。 这意味着您可以使用O(1)
辅助内存一次完成此操作。