算法训练:出现次数最多的整数

问题描述
  编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
  输入格式:第一行是一个整数NN £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
  输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
样例输出
150
 
思路:这是我自己的思路是先统计各个元素出现的次数,并且定义一个tem数组来记录这些次数,然后最后比较次数的最大值,定义一个sign来记录tem数组中最大元素的的下标值,而这个sign+tem[sign]-1就是原数组出现次数最多的元素的最后一个的下标。挺难解释,结合实例,按照题给样例得出tem数组为[1,2,1,1],比较出最大值记录用sign记录下标则sign=1,sign+tem[sign]-1 = 2, num[2] = 150,即最多元素出现的最后坐标。
 1 #include<stdio.h>
 2 
 3 int main(void)
 4 {
 5     int num[20];
 6     int tem[20] = {0};
 7     int n,i,k = 0;
 8 
 9     scanf("%d", &n);
10     if (n == 0 || n == -1)
11     {
12         return 0;
13     }
14     for (i = 0; i < n; i++)
15     {
16         scanf("%d", &num[i]);
17     }
18 
19     tem[k]++;
20     for (i = 1; i < n; i++) //各元素计数
21     {
22         if (num[i] == num[i - 1])
23         {
24             tem[k]++;
25         }
26         else
27         {
28             tem[++k]++;
29         }
30     }
31 
32     int sign = 0;
33     int max = tem[0];
34     for (i = 1; i < k + 1; i++) //找出最大值
35     {
36         if (tem[i] > max)
37         {
38             max = tem[i];
39             sign = i;
40         }
41     }
42 
43     printf("%d", num[sign+tem[sign]-1]);
44     return 0;
45 }

另一个更厉害的算法,真心佩服,来自https://blog.csdn.net/iamldy/article/details/69214182

 1 #include<stdio.h>
 2 
 3 int a[100000];
 4 
 5 int main()
 6 {
 7     int n;
 8     int i=0;
 9     int m=0;
10     ;
11 
12     scanf("%d",&n);
13     if(n>0&&n<=20)
14     {
15 
16 
17         for(;i<n;i++)
18         {
19             scanf("%d",&m);
20             a[m]++;
21         }
22         int s=0;
23         int g;
24         for(i=0;i<100000;i++)
25         {
26             if(a[i]>s)
27             {
28                 s=a[i]; 
29                 g=i;
30             }
31 
32         }
33         printf("%d",g);
34         }
35     return 0;
36 }
原文地址:https://www.cnblogs.com/ZhengLijie/p/12519939.html