3

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

LeastFrequent - 从 System.in 输入的 10 个整数列表中输出出现频率最低的整数及其出现次数。如果列表中的多个整数出现频率最低,则输出任何出现频率最低的整数。将您的课程命名为 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");
    }
}

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

有没有人有任何想法?

请帮忙!!

4

3 回答 3

4

您可以使用长度为 201 的辅助数组,因为您的范围是 [-100,100]。

int[] counters = new int[201];

假设用户输入 -59,增加特定计数器:(您应该在输入的数字上加 100 以查找索引,认为 -100 位于索引 0 处)

counters[-59 + 100]++;

然后遍历 counters 数组并找到最小的非零元素。从该索引中减去 100,这肯定是最不常见的数字。

int  min = Integer.MIN_VALUE;

for(int i: counters)
{
   if(i != 0 && i < min)
     min = i;
}

现在,这意味着counters[i]发生频率最低,这与(i-100) 实际值相对应。

于 2012-11-29T04:09:16.750 回答
3

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

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

数组已排序的事实允许您通过寻找最短的连续运行相等数字来优化此算法。这意味着您可以通过O(1)辅助存储器一次性完成此操作。

于 2012-11-29T04:08:50.300 回答
3

两个变化:

  1. minCount用最大索引(即 10)初始化为:

    private static int minCount = 10;
    
  2. if将要比较less than的更改greater than为:

    if(count < minCount){
    

这样,您将minCount使用较低的计数来更改,每当您收到较低的出现计数时,最终,它将具有最少的计数。

我觉得,休息就好。希望这可以修复您的程序。

于 2012-11-29T04:19:18.483 回答