记录一下自己的复习过程
最近开始准备CCF CSP考试了,练习一下历年真题。
问题描述
试题编号: 201312-1
试题名称: 出现次数最多的数
时间限制: 1.0s
内存限制: 256.0MB
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
输入格式
输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。
输出格式
输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。
样例输入
6
10 1 10 20 30 20
样例输出
10
详细代码
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int value;
int count;
}A;
int main() {
int n,i,j;
scanf("%d",&n);
A a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
a[i].count=1;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(a[i].value==a[j].value&&i!=j){
a[i].count++;
}
}
}
int max=0;
for(i=0;i<n;i++){
if(a[i].count>a[max].count){
max=i;
}else if(a[i].count==a[max].count&&a[i].value<a[max].value){
max=i;
}
}
printf("%d",a[max].value);
return 0;
}
开始没有考虑到结构体数组,调试了很久,后来参考别人的代码采用了结构体数组进行修改,但解法有些复杂。
又参考了以下代码:
#include <stdio.h>
#include <string.h>
#define N 10000
int sicount[N + 1];
int main(void)
{
int n, v, i;
// 变量初始化
memset(sicount, 0, sizeof(sicount));
// 输入数据,进行统计
scanf("%d", &n);
while(n--) {
scanf("%d", &v);
sicount[v]++;
}
// 找出出现次数最多的数
int ans, maxcount=0;
for(i=1; i<=N; i++) {
if(sicount[i] > maxcount) {
ans = i;
maxcount = sicount[i];
}
}
// 输出结果
printf("%d\n", ans);
return 0;
}
参考自CCF201312-1 出现次数最多的数
此代码用数组下表代表输入数据,数组内存的是出现次数。较为简单的统计了每个数的次数,同时也只用通过比较来找出出现最多次数的数。从1开始运行,就直接解决了出现次数相同时,输出较小数的问题。
总结
自己的逻辑思维能力太弱,把简单问题复杂化了。这道题还有一个解法(使用STL的map进行统计)还有待学习。