问题描述
任意输入N个正整数,输出其中出现频率最高的数,及其出现次数;如果有两个相同频率的数,则输出出现频率最少的那个数,及其出现次数。
解题思路
本题主要有一个比较难处理的地方,那就是如何记录每个数出现的次数。在不会用C++的set或map键值对等高级一些的数据结构的情况下,仅用一维数组处理还是比较锻炼思维的(对我个人而言 哈哈哈)。
我的思路:首先利用ungetc()函数输入,然后对原数组a[ ]重复元素进行去重并放入一个新数组b[ ]中,记录下每个元素重复的次数t[ ]。将t[ ]数组中元素从大到小排序,当然要注意对应好b[ ]的下标,b[ ]中对应下标的元素也要换位置。这样就可以得到按出现次数排列的数组,取首位位置上的元素即为出现频率最高和最低的元素。
注意如果主函数中需要调用换序函数swap(),一定要传地址给指针,让指针p、q所指向的单元内容p与q进行互换,这样主函数中的变量值才能互换。只换形参的值是没有用的。
正确示例
void swap1(int *p, int *q){
int temp;
temp=*p;
*p=*q;
*q=temp;
}
错误案例
void swap2(int xc, int yc){
int temp;
temp=xc;
xc=yc;
yc=temp;
}
完整代码
#include <iostream>
using namespace std;
void swap(int *p, int *q){
int temp;
temp=*p;
*p=*q;
*q=temp;
}
int main(void){
int a[100]; //原数组
int b[100]; //去重后的数组
int x; //出现最多或最少的数
int time; //出现次数
int t[100]; //记录各元素出现次数
int i, j; //for循环用的标记变量
char c; //输入时使用
int k=0; //记录数组中实际元素个数
//数字输入的处理
while((c=getchar())!='\n'){
if(c!=' '){
ungetc(c, stdin);
cin>>a[k++];
}
}
//数组初始化
for(i=0;i<k;i++){
b[i]=0;
t[i]=0;
}
//将原数组a[]元素去重,放入新数组b[],并用t[]记录重复次数
int p=0; //数组b[]的标记变量
int d=0; //记录数组b[]和t[]中实际元素个数
for(i=0;i<k;i++){
if((a[i+1]>0)&&(a[i+1]==a[i])){
t[p]++;
continue;
}else{
b[p]=a[i];
t[p]++;
p++;
d=p;
}
}
//将b[]和t[]按从大到小排序(冒泡排序)
for(i=d-1;i>0;i--){
for(j=0;j<i;j++){
if(t[j]<t[j+1]){
swap(&(t[j]), &(t[j+1]));
swap(&(b[j]), &(b[j+1]));
}
}
}
// 测试时输出显示
// for(i=0;i<d;i++){
// cout<<b[i]<<" ";
// }
// cout<<endl;
// for(i=0;i<d;i++){
// cout<<t[i]<<" ";
// }
// cout<<endl;
if(t[0]==t[1]){
cout<<"出现频数最少的是:"<<b[d-1]<<",共出现"<<t[d-1]<<"次"<<endl;
} else{
cout<<"出现频数最多的是:"<<b[0]<<",共出现"<<t[0]<<"次"<<endl;
}
return 0;
}
测试结果
PS:有更好的思路和方法欢迎评论和指点!