题目描述
对于给定一个整数序列,你的任务是确定这个序列中出现次数最多的整数和它出现的次数。
输入
输入包含多组测试数据,每组数据的第一行为一个整数 N(0 < N <= 1000),接下来一行为 N 个以空格分隔的整数 Ai,|Ai| < 2^31。
输出
对于每组测试数据,输出只有一行为两个空格分隔的整数A、B,分别代表出现次数最多的那个数和出现次数,如果出现次数最多的有多个,输出数值最小的那个。
示例输入
4 1 2 3 3 5 1 2 3 4 5
示例输出
3 2 1 1 先前用另一种方法做的,可能是由于数太大了,所以一直re,就换了一种方法. 正确代码:#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #include<cmath> using namespace std; int main() { int n; int a[1010]; int b[1010]; while(~scanf("%d",&n)) { int max=-1;//保存次数 int cnt=0;//每个数字出现的次数,这是一个动态的量 int p=0;//记录最多次数的数字的下标 memset(b,0,sizeof(b)); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } for(int i=1; i<=n; i++) { cnt=0; for(int j=i+1; j<=n; j++) { if(a[j]==a[i]) { cnt++; } } if(max<cnt) { max=cnt; p=i; } else if(cnt==max&&a[i]<a[p])//如果次数相同并且比前边的小 { p=i; max=cnt; } } printf("%d %d\n",a[p],max+1);//加一是代表最少有一次 } return 0; }
把我的错误代码也放上吧,以警示:<span style="font-size:12px;">#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #include<cmath> using namespace std; int main() { int n; unsigned long a[1010]; unsigned long b[1010]; while(~scanf("%d",&n)) { memset(b,0,sizeof(b)); for(int i=1; i<=n; i++) { scanf("%ld",&a[i]); b[a[i]]++; } unsigned long max=0; unsigned long cnt=0; for(int i=1; i<=n; i++) { if(b[a[i]]>max) { max=b[a[i]]; cnt=a[i]; } else if(b[a[i]]==max&&cnt>a[i]) { max=b[a[i]]; cnt=a[i]; } } printf("%ld %ld\n",cnt,max); } return 0; } </span>