1002: 数字排序问题

来源:互联网 发布:学编程需要考哪些证书 编辑:程序博客网 时间:2024/05/21 15:44

1002: 数字排序问题

时间限制: 1 Sec  内存限制: 256 MB
提交: 334  解决: 236
[提交][状态][讨论版]

题目描述

给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

输入

输入的第一行包含一个整数n,表示给定数字的个数。
第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。

输出

输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。

样例输入

125 2 3 3 1 3 4 2 5 2 3 5

样例输出

3 42 35 31 14 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;}



1 1
原创粉丝点击