C/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())!='\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:有更好的思路和方法欢迎评论和指点!

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dijkstra's Monk-ey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值