【问题标题】:find the most frequent number in an array找出数组中出现频率最高的数
【发布时间】:2017-07-18 09:57:18
【问题描述】:

我最近开始学习 C,遇到了这个小测试。

编写一个从用户那里读取 10 个数字的代码。

打印最大和最小输入值,然后打印最频繁的数字。

对我来说一切都很简单,但最常见的数字让我发疯,我搜索了一段时间,找不到任何明确的答案。

我写的代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int hi[10], i=0, largest, smallest;
    while(i<10)
    {
        printf("Enter a number:");
        scanf("%d", &hi[i]);
        i++;
    }
    smallest = hi[0];
    largest = hi[0];
    printf("Entered Numbers: ");
    while(i!=0)
    {
        if(hi[10-i] < smallest) { smallest = hi[10-i]; }
        if(hi[10-i] > largest) { largest = hi[10-i]; }
        printf("%d | ", hi[10-i]);
        i--;
    }

    printf("\nLargest number is = %d || Smallest number is = %d", largest, smallest);
    return 0;
}

我想到的唯一想法是:

  • 制作另一个数组。

  • 获取原始数组中[i]的值。

  • 将 [i] 与原始数组的其余值进行比较(如果它们相等或不相等)。

  • 如果它们相等,则增加另一个数组的值。

  • 检查另一个数组中的最大值,应该是最频繁的数字。

  • 现在,我知道了最常见元素的顺序以及该元素被输入了多少次。

【问题讨论】:

  • @Vittorio Romeo:嗯,是的,这似乎是 OP 已经想出的解决方案。这对我来说似乎很明智。
  • 查看此处提供的解决方案:stackoverflow.com/questions/26566265/… 并对其进行编辑以满足您的需求。
  • 对数组进行排序。然后在 for 循环中从 hi[0]..h[9] 枚举数组中的项目。然后使用额外的变量来跟踪重复计数。
  • @sudo_coffee 这正是我所需要的!对其进行了一些修改,并且有效。 doynax,哎呀,所以我想我的想法还不错。我基本上是害怕在循环中的某个地方搞砸。

标签: c arrays


【解决方案1】:

使用 hashmap 会更有效。在那里,您可以使用输入的数字作为键并将值设置为 1。当用户给出新数字时,您只需检查新数字是否已经在地图中。如果是这样,则将值设置为 2,否则将值添加为 1。

【讨论】:

  • 在我看来,这样的方案会给 10 个元素增加相当多的复杂性和有限的好处。尽管如此,对于更大的问题集来说还是足够明智的
  • 是的,完全正确。但我认为这不是“现实世界的问题”。它只是为了学习编程。并且有一个关于哈希图的提示很好地了解这个数据结构;)
  • hashmap 是我以前从未听说过或遇到过的东西。随着我前进,学习新东西对我也很重要,我会检查一下。谢谢!
【解决方案2】:

支持 Markus 所说的,哈希图确实是通用解决方案的理想选择,因此您可以缩短渐近时间,但由于您只做 10 个数组,因此使用 2D 数组存储频率将工作得很好。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int hi[10][2], i=0,j=0,largest, smallest;

    while(i<10)
    {
        printf("Enter a number:");
        scanf("%d", &hi[i][0]);
        i++;
    }
    smallest = hi[0][0];
    largest = hi[0][0];
    printf("Entered Numbers: ");
    while(i!=0)
    {
        hi[10-i][1] = 0;
        if(hi[10-i][0] < smallest) { smallest = hi[10-i][0]; }
        if(hi[10-i][0] > largest) { largest = hi[10-i][0]; }
        printf("%d | ", hi[10-i][0]);
        i--;
    }
    int most_freq = 0;
    for (i = 0; i < 10; i++){
        for (j = 0; j < 10; j++){
            if(hi[i][0] == hi[j][0]){
                hi[i][1]++;
                if (hi[i][1] > most_freq){
                    most_freq = hi[i][0];
                }
            }
        }
    }

    printf("\nLargest number is = %d || Smallest number is = %d", largest, smallest);
    printf("\nMost frequent is = %d\n", most_freq);
    return 0;
}

【讨论】:

  • 请不要发布代码图片。而是将代码作为格式化文本发布。
  • 以后会做的,我很抱歉。
  • 这里不需要二维数组。使用 2 个数组会更清楚 - 所以使用 hi[i]count[i] 而不是 hi[i][0]hi[i][1]
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多