资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
在一个有限的正整数序列中,有些数会多次重复出现在这个序列中。
如序列:3,1,2,1,5,1,2。其中1就出现3次,2出现2次,3出现1 次,5出现1次。
你的任务是对于给定的正整数序列,从小到大依次输出序列中出现的数及出现的次数。
输入格式
第一行正整数n,表示给定序列中正整数的个数。
第二行是n 个用空格隔开的正整数x,代表给定的序列。
输出格式
若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。
样例输入
12
8 2 8 2 2 11 1 1 8 1 13 13
样例输出
1 3
2 3
8 3
11 1
13 2
数据规模和约定
数据:n<=1000;0<x<=1000,000。
给大家讲一下这个题的思路,想通了其实还是挺简单的:
首先就是一个含有n个数的数组,它可以有多个相同的数字,要求我们按照数字的大小,从小到大输出这些数字,并且输出该数字出现的次数。
第一我们可以先将这个数组从小到大进行排列,冒泡,选择,插入排序都可以,
为了防止某些同学不会,我讲一下选择排序:
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(f[i]>f[j])
{
t=f[i];
f[i]=f[j];
f[j]=t;
}
}
}
排序完成以后,我们可以设置一个两层for循环和设置一个count=1在每次第二个for循环开始后,和选择排序差不多,但是我们在第一层中需要++count
先给大家看一下代码:
#include<stdio.h>
int main()
{
int n,x,j,t,count,i;
int f[1000];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&f[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(f[i]>f[j])
{
t=f[i];
f[i]=f[j];
f[j]=t;
}
}
}
for(i=0;i<n-1;i+=count)//假设我们数组里面有count个1那么我们在f[0],就可以把1有多少个知道,然后直接跳到1后面的数字;
{
count=1;
for(j=i+1;j<n;j++)
{
if(f[i]==f[j])
{
count++;//j从i+1开始,因为已经从小到大排列的,所以如果遇到和f[i]相等的数就count++;
}
}
printf("%d %d",f[i],count);
}
return 0;
}