题目列表
CCF 2015-3-2 数字排序 C语言
问题描述
给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
评测用例规模与约定
1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。
方法一:
我的方法:
1、首先对输入的n个整数排序,这样相同的数据解释连续的,方便之后统计个数;
2、使用结构体,对整数值用value表示,出现的次数用count表示,然后对排好序的n个数,统计进结构体数组;
3、对结构体数组排序,出现次数count递减,count一样多的value小的在前,大的在后;
4、依次输出结构体
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int value;
int count;
}NUM;
int main()
{
int n,i,j,t,temp,count,a[1000];;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
//对n个数从大到小排序
for(i=0;i<n;i++)
for(j=0;j<n-i-1;j++)
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
//将n个数统计进NUM结构体的数组,value代表输入的整数,count代表出现的次数
NUM b[1000],tmp;
t=0;
count=1;
for(i=1;i<=n;i++)
{
if(a[i]==a[i-1])
{
count++;
}
else
{
b[t].value=a[i-1];
b[t].count=count;
count=1;
t++;
}
}
//对结构体数组排序
for(i=0;i<t;i++)
for(j=0;j<t-i-1;j++)
{
if(b[j].count<=b[j+1].count&&b[j].value>b[j+1].value)
{
tmp=b[j];
b[j]=b[j+1];
b[j+1]=tmp;
}
}
//输出结果
for(i=0;i<t;i++)
printf("%d %d\n",b[i].value,b[i].count);
return 0;
}
方法二:
该题采用C语言解决有一些繁琐,直到我看到一位大神采取的暴力解法,100分完全通过测试,看到该算法只能用一个“妙”字来形容,
也为以后解题提供了一个思路
现将代码展示如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,n,s=0;
int a[1001]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&s);
a[s]++;
}
for(i=1001;i>0;i--)
{
for(j=0;j<1001;j++)
{
if(a[j]==i)
printf("%d %d\n",j,a[j]);
}
}
return 0;
}