ccf-出现次数最多的数

问题描述

  给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。

输入格式

  输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
  输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出格式

  输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

样例输入

6
10 1 10 20 30 20

样例输出

10

解题思路:

题目比较简单,有两种方法。

(1)由于题目说输入的数字比较小,所以设置对应的数组空间不能超出提问范围,那么每输入一个数字,对于的编号加1,数组a存的是下标i的输入次数,最后遍历一次,就可以输出结果。这里主要涉及数组初始化为0的问题。后面通过查阅资料知道定义静态数组时,并初始化可以全部设置为0.否则可以用memset函数初始化。具体代码如下。

(2)第二种思路,用c++里面的map映射,既可以快速统计每个输入数的个数。具体看代码。

方法一:

#include<stdio.h>
int main(){
	int n,temp;
	int a[10001]={0};//memset(a,0,sizeof(a)) 
	int i;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&temp);
		a[temp]=a[temp]+1;
	}
	int max=0,maxi;
	for(i=0;i<=10000;i++){
		if(a[i]>max){
			max=a[i];
			maxi=i;
		}
	}
	printf("%d",maxi);
	return 0;
} 

方法二:

#include<iostream>
#include<map>
using namespace std;
int main(){
	int n,b;
	int max=0,maxi=-1;
	map<int,int>p;
	scanf("%d",&n);
	int i;
	for(i=0;i<n;i++){
		scanf("%d",&b);
		p[b]++;
	}
	// for(map<int,int>::iterator it=p.begin();it!=p.end();it++){
	 
	for(map<int,int>::iterator it=p.begin();it!=p.end();it++){
		if(it->second>max){
			max=it->second;
			maxi=it->first;
		}
	}
	printf("%d",maxi);
	return 0;
}
发布了84 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sunandstarws/article/details/97036195
今日推荐