Java - 查找已排序数组中最不常见的整数

时间:2012-11-29 04:05:25

标签: java arrays sorting

我为家庭作业分配了编程问题,而且我处于静止状态。我今天搜索了几个小时试图找到答案,似乎从来没有在这里问过。我基本上需要找到数组模式的反转。以下是我被要求找到解决方案的问题:

  

LeastFrequent - 输出最不频繁出现的整数   来自输入的10个整数的列表中的出现次数   System.in。如果列表中的多个整数发生频率最低,   输出最不频繁出现的任何整数。为你的班级命名   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 < arr.length; j++)
            {
                if(arr[j] == arr[i]) 
                {
                    count++;
                }
            }

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

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

有没有人有任何想法?

请帮助!!

3 个答案:

答案 0 :(得分:4)

您可以使用长度为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 :(得分:3)

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

  1. 计算每个数字在数组中出现的次数。
  2. 找出最小的数量。
  3. 返回与该计数对应的值。这要求您以某种方式存储映射到其计数的值。
  4. 数组排序的事实允许你通过寻找最短的连续相同数字运行来优化这个算法。这意味着你可以在一次通过中执行此操作,{{1}辅助记忆。

答案 2 :(得分:3)

两个变化:

  1. 使用最大索引初始化minCount,即10为:

    private static int minCount = 10;
    
  2. if更改为less than以代替greater than进行比较:

    if(count < minCount){
    
  3. 通过这种方式,只要您收到较低的出现次数,就会更改minCount的次数较少,最后,它会有最少的次数。

    我想,休息很好。希望这可以修复你的程序。