hnu暑期软件能力实训1-1.众数

写在前面,这是我第一次发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天前写的代码,现在看起来注释少了点,可能不太容易看得懂,而且相比于这题的位置来说似乎过于复杂,显得冗长一些了,还望大家多多批评指正!(当然最后是有建设性的意见哩!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值