1002: 数字排序问题
时间限制: 1 Sec 内存限制: 256 MB提交: 334 解决: 236
[ 提交][ 状态][ 讨论版]
题目描述
给定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
方法一:
#include<iostream>
using namespace std;
struct A{
int times;
int number;
};
int main()
{
int n;
cin>>n;
A a[1000];
for(int i=0;i<n;i++)
{
cin>>a[i].number;
a[i].times=1;
}
for(int i=1;i<n;i++) //先将输入的数字排序使最后次数相同时,按数字从小到大输出
{
int j=i;
int temp=a[i].number;
while(j>0&&temp<a[j-1].number)
{
a[j].number=a[j-1].number;
j--;
}
a[j].number=temp;
}
for(int i=0;i<n-1;i++) //遍历数组使相同数字的次数累加,已经记过的将次数赋为-1避免重复
{
for(int j=i+1;j<n;j++)
{
if(a[i].times!=-1&&a[j].times!=-1&&a[i].number==a[j].number)
{
a[i].times++;
a[j].times=-1;
}
}
}
for(int i=1;i<n;i++) //将次数兼对应的数字从大到小排序,
{
int j=i;
int temp1=a[i].times;
int temp2=a[i].number;
while(j>0&&temp1>a[j-1].times)
{
a[j].times=a[j-1].times;
a[j].number=a[j-1].number;
j--;
}
a[j].times=temp1;
a[j].number=temp2;
}
for(int k=0;k<n;k++)
{
if(a[k].times!=-1)
cout<<a[k].number<<" "<<a[k].times<<endl;
}
return 0;
}
方法二:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct A{
int times;
int number;
};
int main()
{
int n;
cin>>n;
A a[n];
vector<int>iv(n); //创建动态数组
for(int i=0;i<n;i++)
cin>>iv[i];
for(int i=1;i<n;i++) //排序
{
int j=i;
int temp=iv[i];
while(j>0&&temp<iv[j-1])
{
iv[j]=iv[j-1];
j--;
}
iv[j]=temp;
}
int k=0; //计数
for(int i=0;i<n;i++)
{
if(iv[i]!=iv[i+1]) //将重复的数字剔除
{
a[k].number=iv[i];
a[k].times=count(iv.begin(),iv.end(),iv[i]); //用于清点特定值的个数并将结果赋给结构
k++;
}
}
for(int i=1;i<k;i++) //最后将结构中的次数排序即可输出
{
int j=i;
int temp1=a[i].times;
int temp2=a[i].number;
while(j>0&&temp1>a[j-1].times)
{
a[j].times=a[j-1].times;
a[j].number=a[j-1].number;
j--;
}
a[j].times=temp1;
a[j].number=temp2;
}
for(int i=0;i<k;i++)
{
if(a[i].number==a[i+1].number)
continue;
cout<<a[i].number<<" "<<a[i].times<<endl;
}
return 0;
}