2017-02-27 57 views
0

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

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

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

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

+0

@Vittorio Romeo:嗯,是的,这似乎是OP已经想出的解决方案。这对我来说似乎很明智。 – doynax

+0

看看这里提供的解决方案:http://stackoverflow.com/questions/26566265/frequency-of-numbers-in-a-1d-array并编辑它以满足您的需求。 –

+0

对数组进行排序。然后在for循环中枚举hi [0] .. h [9]中的数组中的项。然后使用额外的变量来跟踪重复计数。 – selbie

回答

3

使用散列表会更高效。您可以使用输入号码作为密钥并将该值设置为1.当用户给出新号码时,您只需检查新号码是否已经在地图中。如果是,则将该值设置为2,否则将新值添加为值1.

+1

在我看来,这样的方案会增加10个元素的复杂性和有限的好处。尽管如此,对于更大的问题设置足够明智 – doynax

+0

是的,这是完全正确的。但我认为这不是“真正的世界问题”。它只是为了学习编程。有一个hashmap的提示是很好的了解这个数据结构;) – Markus

+0

hashmap是我从来没有听说过或遇到过的东西。 学习新东西对我来说也很重要,因为我前进,我会检查出来。谢谢! – benjaminwright

1

对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; 
} 
+0

请勿张贴图片的代码。相反,将代码_as格式化为text_。 – ForceBru

+0

未来会做,我的道歉。 – kr1tzb1tz

+3

这里你不需要一个二维数组。使用2个数组会更清晰 - 所以使用'hi [i]'和'count [i]'而不是'hi [i] [0]'和'hi [i] [1]'。 – anatolyg

相关问题