PAT 乙级 1042 字符统计(c++)

该程序用于找出给定字符串中出现频率最高的英文字母。通过将字符串转换为小写,删除空格,使用map存储每个字母的出现次数,然后利用vector和sort进行排序,最终输出频率最高且字母序最小的字母及其出现次数。
摘要由CSDN通过智能技术生成

1042 字符统计

题目描述

请编写程序,找出一段给定文字中出现最频繁的那个英文字母。

输入格式:

输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出格式:

在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

样例

输入

This is a simple TEST. There ARE numbers and other symbols 1&2&3…

输出

e 7

分析

一种简单的方法是使用下标法,先全部变为小写字母,然后存入对应位置,记录出现的次数,找到最大值,具体参考链接: 柳神代码,但是我为了熟练掌握STL的相关使用,因此采用string、map、vector。

具体思路

先用getline存字符串(cin遇到空格无法继续存入空格之后的字符串),使用transform(开始位置,结束位置,存放的开始位置,转为大写/小写)将存入的字符串全转为小写,再使用erase加remove函数删除空格,随后将字母存入map中,key为字母,value为出现的次数,为了使用sort函数排序,将map存入vector中,使用sort自定义cmp函数进行排序,输出第一个值即为答案。

代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<char,int> a,pair<char,int> b){
	if(a.second!=b.second) return a.second>b.second;
	else return a.first<b.first;
}
int main(){
	string s;
	getline(cin,s);
	map<char,int>ma;
    //大写转小写
	transform(s.begin(),s.end(),s.begin(),::tolower);
    //删除空格
	s.erase(remove(s.begin(),s.end(),' '),s.end());
	for(int i=0;i<s.size();i++){
		if('a'<=s[i]&&s[i]<='z')
			ma[s[i]]++;
	}
    //将 map放入vector中 为了使用sort函数排序
	vector<pair<char,int> > vec(ma.begin(),ma.end());
	vector<pair<char,int> >::iterator it;
	sort(vec.begin(),vec.end(),cmp);
	it = vec.begin();
	cout<<it->first<<" "<<it->second<<endl;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值