C++统计一串数字中出现频率最高的数及其出现次数
问题描述
任意输入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())!= ){ 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:有更好的思路和方法欢迎评论和指点!
下一篇:
哈夫曼树带权路径长度