问题描述
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
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 }