3192. 出现次数最多的数 13年12月CSP

Posted infocodez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3192. 出现次数最多的数 13年12月CSP相关的知识,希望对你有一定的参考价值。

3192. 出现次数最多的数 - AcWing题库

13年12月CCF计算机软件能力认证,第1题

 

第一次提交,数据范围写错了,wa,日常迷糊,太久不写题了。

第二次提交,试图在一次循环内解决,但忘了判断答案是否为最小的数,wa。

 

真没必要在螺蛳壳里做道场。在简单题里降低时间复杂度,没有什么实际意义,反而提高错误率。能快速ac的代码,才是好代码!

 

常规解法,两次循环的ac代码: 

#include<bits/stdc++.h>

using namespace std;

const int N = 10000+1;
int cnt[N];

int main()
	int n,ans = 0;
	cin>>n;
	while(n--)
		int x;
		cin>>x;
		cnt[x]++;
	 
	for(int i = 1;i <= N;i++)
		if(cnt[i] > cnt[ans]) ans = i;
	
	cout<<ans;
	return 0;

一次循环的ac代码:

#include<bits/stdc++.h>

using namespace std;

const int N = 10000+1;
int cnt[N];

int main()
	int n,ans = 0,max = 0;
	cin>>n;
	while(n--)
		int x;
		cin>>x;
		cnt[x]++;
		if(cnt[x] > max)
			max = cnt[x];
			ans = x;
		else if(cnt[x] == max)
			if(x < ans) ans = x;
		
	 
	cout<<ans;
	return 0;

 

查找出现次数最多的数

三种思路:
 
  • 最基本的:
    • 排序,然后遍历
  • 打擂法:
    • 从第一个数开始,上擂台
    • 后一个数如果与擂台上的一致,则守擂计数+1
    • 后一个数如果与擂台上的不一致,则守擂计数-1
    • 一旦守擂计数减为0,就将台上的数挤掉,然后刚刚打擂的数上台
  • 类似上一种:
    • 任意两个不同的数相互抵消,最后剩下的唯一个或多个相同的数就是最多的数
 
一旦找出最多的数,就可以重新遍历得到该数的出现次数了

以上是关于3192. 出现次数最多的数 13年12月CSP的主要内容,如果未能解决你的问题,请参考以下文章

CSP201312-1:出现次数最多的数

oj-ccf-csp-201312-1-出现次数最多的数

ccf csp题解201312-1

CCF认证真题-(201312-1)-出现次数最多的数

如何求出数组中出现次数最多的数字(C#实现)

查找出现次数最多的数