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"); } } 

基本上我想,如果我能找到模式,我可以反转该算法并找到最不常见的,但这不起作用,因为它总是读为零。

有没有人有任何想法?

请帮忙!!

两个变化:

  1. 初始化具有最大索引的minCount ,即10:

     private static int minCount = 10; 
  2. 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)

想想你如何用笔和纸做这件事。

  1. 计算每个数字在数组中出现的次数。
  2. 找到最小的数量。
  3. 返回与该计数对应的值。 这要求您以某种方式存储映射到其计数的值。

arrays排序的事实允许您通过查找相同数字的最短连续运行来优化此算法 这意味着您可以使用O(1)辅助内存一次完成此操作。