【问题标题】:Java - Finding the least common integer in a sorted arrayJava - 在排序数组中查找最不常见的整数
【发布时间】:2012-11-17 02:32:03
【问题描述】:

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

LeastFrequent - 输出出现频率最低的整数 其出现次数来自输入的 10 个整数列表 系统输入如果列表中的多个整数出现频率最低, 输出出现频率最低的任何整数。为你的班级命名 最少。您可以假设所有 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");
    }
}

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

有人有什么想法吗?

请帮忙!!

【问题讨论】:

  • 你可以使用 Map 结构还是只使用普通数组?

标签: java arrays sorting


【解决方案1】:

两个变化:

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

    private static int minCount = 10;
    
  2. if 更改为与less than 进行比较,而不是greater than

    if(count < minCount){
    

这样您将更改 minCount 的计数较低,每当您收到较低的出现计数时,最后它会最少。

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

【讨论】:

  • 谢谢!!!我缺少的部分是=10 ...这个简单的修复已经完成了!!!我真的很感激。
【解决方案2】:

您可以使用长度为 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) 以实际价值为准。

【讨论】:

  • 如何在该计数器数组中找到最不常见的?
  • @user1862003 这是数组的最小值。
  • 糟糕,当我发表评论时,最后一部分不存在。我将尝试实现这一点。谢谢!
  • 我跟着这个,但另一个答案变得更容易解决!感谢您的所有帮助!
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多