写在前面,这是我第一次发csdn博客,之前在这个平台上面学习了不少知识,也逐渐成长到了码龄1年的猿,现在希望能够将自己做出来的题目分享出来,为这个平台提供一些文章的同时也希望在写的过程中收获一些东西,还请大家多多指教
惭愧的是,犹豫目前处于大一,上学期耽于社团活动未能精研c++致使学艺不精,还望大家在垂阅拙作时能够批判性地接受,如果可以的话还望能提出一些有建设性的意见,小生不胜感激。
下面进入正题,我想和水平与我差不多或略低的猿友或小姐姐分享的是本次训练的1~11题,部分题解会有所省略,因为比较容易做出来,后面的题暂且不提的原因是--我也还没太弄得懂(🤣)
1、众数
【问题描述】
一组数据中出现最多的数,称为众数。比如
1 2 3 3
众数为3。一组数据中也可能有多个众数,以最先出现的作为众数。比如
2 2 3 3
众数为2。
问题是一组按升序排好的数据,指出它的众数。
【输入形式】
有多组测试数据(不超过100组测试数据)。
每组测试数据占两行,第一行是正整数N:表示这组测试数据中数据项数。
第二行是N个用空格隔开的正整数,表示这组测试数据的数据元素。每个数据元素都不大于10000。
N=0,表示输入结束,并且不需要处理。
40%的测试数据N 1 ≤N≤ 10;
30%的测试数据N 10 < N≤ 100;
20%的测试数据N 100 < N≤ 1000;
10%的测试数据N 1000 < N≤ 10000;
【输出形式】
对于每组测试数据,输出一行包含一个正整数:对应的众数。
【样例输入】
4 1 2 3 3 4 2 2 3 3 0
【样例输出】
3 2
【样例说明】
【评分标准】
题解:问题分析:所求的是不知数目组数据分别对应的众数,众数为数学概念,指一组数中数目最多的那个数,本题还附加了一个条件——即若有多个众数,以最先出现的作为众数
思路:这也就是说,我们需要将每一组数据截开来,分别去求其最先出现的那个众数。由于求众数的过程比较麻烦,我们可以考虑将其单独放置在一个函数里面,至于每组数据的存储问题,由于给出了每组数据的数据个数,很自然地我们便可以想到使用数组了。
将输入输出问题解决好后,我们还需要来考虑一下求每一组数据众数的函数该怎么写。由于题目中所给的另一条件——即每一组数据已经按照升序排列好了,我们可以考虑使用立断点分别计数的方法来求解。即另设等大数组全部初始化为0,但最后一个数初始化为1,在原数组中i对应的数与i-1对应的数不一样时,将此等大数组第i位置设为1以作标记,之后只需用s(start)与e(end)来分别定位截断点,计算出数的个数并进行比较,若比原先的大才替换便可
另附源码如下:
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int zs(int *a,int N)
{
int zsn=0;
int b[N];
for(int i=0;i<N;i++)
{b[i]=0;
}
b[N-1]=1;
//给b数组赋初值,初始值均为0,最后一个值赋为1
for(int i=1;i<N;i++)
{if(a[i]!=a[i-1])
{b[i-1]=1;
}
}
int s=0,e,d;
for(int i=0;i<N;i++)
{
if(s==0&&b[i]==1)
{e=i;d=e-s;s=e+1;
zsn=a[i];
}
else if(b[i]==1)
{e=i;
if(d<(e-s))
{d=e-s;
zsn=a[i];
}
s=e+1;
}
}
return zsn;
}
int main(int argc, char** argv) {
int N=0;
while(cin>>N&&N!='\0')
{
int a[N];
for(int i=0;i<N;i++)
{cin>>a[i];//输入输出机制目前看来没什么太大问题
}
cout<<zs(a,N)<<endl;//原来如此,不知为何最后又再多输出、多调用了一次函数吗?
}
return 0;
}
这是将近10天前写的代码,现在看起来注释少了点,可能不太容易看得懂,而且相比于这题的位置来说似乎过于复杂,显得冗长一些了,还望大家多多批评指正!(当然最后是有建设性的意见哩!)