zoukankan      html  css  js  c++  java
  • 算法训练:出现次数最多的整数

    问题描述
      编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数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 }
  • 相关阅读:
    iOS动画之模拟音量振动条
    LeetCode Reverse Linked List
    Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
    Python+Django+SAE系列教程16-----cookie&amp;session
    初识MVC之建项
    【Android 系统开发】使用 Source InSight 阅读 Android 源代码
    ym—— Android网络框架Volley(终极篇)
    俯视数据库系统原理
    hdu 1269 迷宫城堡
    2014年湖北省TI杯大学生电子设计竞赛论文格式
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12519939.html
Copyright © 2011-2022 走看看