Openjudge计算概论-求序列中的众数

简介: /*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-10^52,10^52],计算这个序列的众数。
/*=====================================
求序列中的众数
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-10^52,10^52],计算这个序列的众数。

众数是指出现次数最多的那个数。

如果有多个数出现的次数都达到最多,则取在原序列最先出现的数为众数;如果所有的数都相等,则返回"no"。

输入
第一行为序列长度N。

然后是N个数据,每一个数的范围都是在[-10^52,10^52]。 注意,这N个数之间可能有若干个空行隔开。

注意,输入数据可能有一些冗余表达信息,具体来说:

1) 正数和0前面可能有前导0和'+'符号,例如
+000123=123
+0000=0
-0000=0
2)每个数字中不含有空格和其他非数字字符,例如不会出现"100 0"或者"- 100"。
3)每个数字前面至多有一个符号,即不会出现+(-1)、-(+4)和-(-1)等情况。
输出
输出只有 1 行:

该序列的众数或者”no”。

如果有多个数出现的次数都达到最多,则取最先出现的数为众数,并且输出形式应该最简形式。

例如,如果原序列众数为+000123,则输出123;如果原序列众数为+0000或者-0000或者0000,输出0。

负数正常输出,例如:如果原序列众数为-000000001111,就输出-1111。
样例输入
6
-00001
10000
00011111111111111111111111111111111111
-01
+000000011111111111111111111111111111111111
-00000000000001
样例输出
-1
======================================*/
总结:
  这个题目假如不是数据范围太大,直接是统计某些整数出现的次数,那就很简单:
用一个数组a存储每一个新出现的数字同时记录每一次扫描到的数字出现的次数,最后扫描数组a,把找到出现次数最多的那个数字就可以输出结果了。
  现在这个题目,数字以字符串的形式出现,而且可能有多余的前缀字符,所以可以考虑对每一次输入的字符串先进行化简操作在按照上面的算法进行统计工作。
步骤:
  1、循环输入每一个字符串数组。
  2、每输入一个字符串,立即进行化简操作(可以用子函数来完成)
化简操作:
  先检测首字符是否‘+’或‘-’并保存检测结果。
  然后扫描字符串,遇到字符‘0’则要考虑该字符是否有效字符(是否需要保存。注意:这里保存到一个临时数组。)。
  
如此往复循环处理完字符数组,再把临时数组复制到原数组当中以便返回结果。(这个地方要注意是否需要保留‘-’以及整个数字为0值的时候要特别处理。)
化简完后,在原先的循环体内做字符串出现次数的统计工作,算法和简单数字统计类似。(这里要用到strcmp函数比较两个字符串是否一致。)

统计完后再次扫描数组a寻找出现次数最多的那个字符串即可输出结果。

说的不清楚,看代码吧……
  1 #include<stdio.h>
  2 #include<string.h>
  3 struct number
  4 {
  5     char n[60];//表示化为最简形式后的数
  6     int num;//表示这个数出现的次数。
  7 };
  8 void fun(char a[]);//完成对输入的每个数字进行化简的工作 .结果放在原数组
  9 int main()
 10 {
 11     struct number a[130];//存储化简后的数据,每个不同的数存一次,同时记录它的次数
 12     int N,i,len;//共有N个数,len表示a数组已经使用的单元个数
 13     char str1[500];
 14     int j;
 15     int max;//众数在数组a的下标
 16 
 17     freopen("5.in","r",stdin);
 18     scanf("%d",&N);
 19     len=0;
 20     for(i=0;i<N;i++)
 21     {
 22         scanf("%s",str1);
 23         fun(str1);//化简刚刚输入的这个字符串
 24         /*printf("%s\n",str1);*/
 25         for(j=0;j<len;j++)//检测先前是否遇到过和str1一样的数字
 26         {
 27             if(strcmp(a[j].n,str1)==0)
 28             {
 29                 a[j].num++;
 30                 break;
 31             }
 32         }
 33         if(j>=len)
 34         {
 35             strcpy(a[len].n,str1);
 36             a[len].num=1;
 37             len++;
 38         }
 39     }
 40     if(len==1&&len<N)//统计完了,a数组只有一个元素。而且输入的数字个数不是只有1个,说明输入的N个数大小是一样的
 41     {
 42         printf("no\n");
 43     }
 44     else
 45     {
 46         max=0;//默认第0号是众数所在的位置
 47         for(i=1;i<len;i++)
 48         {
 49             if(a[i].num>a[max].num)
 50                 max=i;
 51         }
 52         printf("%s\n",a[max].n);
 53     }
 54     /*for(i=0;i<len;i++)
 55     {
 56         printf("%d  %s\n",a[i].num,a[i].n);
 57     }*/
 58     return 0;
 59 }
 60 void fun(char a[])//完成对输入的每个数字进行化简的工作 .结果放在原数组
 61 {
 62     char temp[65];
 63     int len=strlen(a);
 64     int i;
 65     char flag;
 66     int first=0;//表示是已经否遇到第一个有效字符
 67     int j=0;//记录数组b的长度
 68     int k;
 69     
 70     //下面检测第一个字符是否是正号或者负号
 71     flag='0';
 72     if(a[0]=='-')    flag='-';
 73     else if(a[0]=='+')    flag='+';
 74 
 75     //根据第一字符的结果决定循环变量i的初值
 76     if(flag!='0')   i=1;
 77     else i=0;
 78     //下面是化简数组a代表的数字,结果暂存在temp数组。
 79     for( ;i<len;i++)
 80     {
 81         if(a[i]=='0')
 82         {
 83             if(first==1)//先前已经遇到了第一个有效字符,所以这个0是有效字符
 84             {
 85                 temp[j]=a[i];
 86                 j++;
 87             }//如果first==0则是当前这个字符是无效字符,可以直接忽略当前的这个a[i]
 88         }
 89         else
 90         {
 91             first=1;//标记一下:遇到了有效字符
 92             temp[j]=a[i];
 93             j++;
 94         }
 95     }
 96     //下面把temp数组存储的化简结果复制到a数组以便返回结果 
 97     if(j==0)//整个数字是0
 98     {
 99         a[0]='0';
100         a[1]='\0';
101     }
102     else
103     {
104         if(flag=='-')
105         {
106             a[0]=flag;
107             k=1;
108         }
109         else
110         {
111             k=0;
112         }
113         for(i=0;i<j;i++)
114         {
115             a[k]=temp[i];
116             k++;
117         }
118         a[k]='\0';//截止符号
119     }
120 }

 

相关文章
|
JSON 自然语言处理 数据格式
DSL语法
DSL语法
264 0
|
11月前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
224 2
|
人工智能 算法 大数据
探究操作系统的心脏:调度算法的进化与影响
本文深入探讨了操作系统中核心组件——调度算法的发展及其对系统性能的影响。通过分析先来先服务、短作业优先、时间片轮转等传统调度算法,阐述了它们的原理和优缺点。同时,讨论了现代调度算法如多级队列和优先级调度在提高系统响应速度和处理能力方面的作用。文章还探讨了实时系统中的调度挑战,以及如何通过优化调度策略来满足不同应用场景下的性能需求。
|
Linux 数据安全/隐私保护
在Linux中,如何进行文件系统的迁移和升级?
在Linux中,如何进行文件系统的迁移和升级?
|
数据采集 监控 数据挖掘
ERP系统中的数据分析与报表生成
【7月更文挑战第25天】 ERP系统中的数据分析与报表生成
919 2
|
存储 网络安全 虚拟化
VMWare ESXi 7.0的磁盘空间莫名少了120 GB?看这里!
VMWare ESXi 7.0的磁盘空间莫名少了120 GB?看这里!
|
弹性计算 前端开发 JavaScript
前端新趋势?有了Web Component,还用纠结Vue或React?
Web Component 的概念最早在 2011 年被 Google 提出,并在 2018 年 V1 版本开始被主流浏览器所支持(除了 IE)。
第8章 概率统计——8.3 累积概率分布
第8章 概率统计——8.3 累积概率分布
第8章 概率统计——8.3 累积概率分布
|
机器学习/深度学习 自然语言处理 大数据
INTERSPEECH 2022论文解读|Paraformer: 高识别率、高计算效率的单轮非自回归端到端语音识别模型
INTERSPEECH 是由国际语音通讯协会(International Speech Communication Association, ISCA)创办的语音信号处理领域顶级旗舰国际会议。历届 INTERSPEECH 会议都备受全球各地语音语言领域人士的广泛关注。 本文介绍一种具有高识别率与计算效率的单轮非自回归模型 Paraformer。该论文已被 INTERSPEECH 2022 接收。
1146 0
INTERSPEECH 2022论文解读|Paraformer: 高识别率、高计算效率的单轮非自回归端到端语音识别模型
|
域名解析 弹性计算 安全
使用阿里云服务器三分钟搭建网站(阿里云建站教程)
使用阿里云服务器三分钟搭建网站(阿里云建站教程)使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网以搭建WordPress网站博客为例,来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程:
979 0