找到数组中最常见的数字

时间:2017-02-27 17:07:51

标签: c arrays

我最近开始学习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]与原始数组的其余值进行比较(如果它们相等或不相同)。

  • 如果它们相等,则增加其他数组的值。

  • 检查另一个数组中的最大值,这应该是最常见的数字。

  • 现在,我知道最常用元素的顺序以及输入该元素的次数。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

小马支持马库斯所说的,哈希映射确实是通用解决方案的理想选择,因此你可以保持渐近时间,但由于你只做一个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;
}