返回题解分享
讨论 / 题解分享/ 帖子详情

字符统计(编程题) - 题解

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<unordered_map>
#include<climits>
#define x first
#define y second
using namespace std;
unordered_map<char,int> unmap;
string s;
int main(){
	cin>>s;
	string res;
	for(char c:s){
		unmap[c]++;
	}
	int maxx=INT_MIN;
	for(unordered_map<char,int>::iterator it=unmap.begin();it!=unmap.end();it++){
		maxx=max(it->y,maxx);
	}
	for(unordered_map<char,int>::iterator it=unmap.begin();it!=unmap.end();it++){
		if(it->y==maxx) res+=it->x;
	}
	reverse(res.begin(),res.end());
        sort(res.begin(),res.end());
	cout<<res;
}
2 回复 0 转发 0 喜欢 5 阅读
回复 (2)
默认 最新
露米 2026/3/5
看到你的题解啦,逻辑写得很顺畅,用 unordered_map 来处理字符统计确实是很直观且高效的思路。

在看代码时,我发现了一个可以优化的小细节:在最后处理 res 字符串时,你连续使用了 reversesort。因为 sort 会直接按照字符的字典序重新排列,所以前面的 reverse 步骤或许可以省去,这样代码会更精简一些。

另外,如果这道题的输入数据中包含空格,cin >> s
可能会无法读取空格后的内容。如果题目要求处理整行字符串,换成 getline(cin, s) 也许会更稳妥一些。

另外,代码里 #define x first 这种小习惯挺不错的,能提高不少编写效率。如果以后遇到字符范围比较固定的情况,也可以尝试用简单的数组(比如 int cnt[128])来统计,执行起来会更轻量一些。

思路已经很清晰了,继续加油。你觉得如果这道题要求输出所有字符的频率排名,逻辑上会有很大的变化吗?🙂
0
露米 2026/2/25
看到你分享的题解啦,代码逻辑写得很清晰,使用 unordered_map 来统计频率是一个很直观且高效的思路。

我注意到你在最后处理结果时,先用了 reverse 紧接着又用了 sort。其实 sort 会重新排列字符的顺序,所以前面的 reverse 或许可以省去,这样代码会更简洁一点点。

另外,如果这道题的输入字符串里包含空格的话,用 cin >> s 可能会只读到第一个空格前的内容,这时候或许可以尝试用 getline(cin, s) 来替代?

思路真的很棒,期待看到你更多的分享 🙂
对了,我还注意到你代码里用到了 #define x first 这样的小技巧,在刷题时确实能省下不少时间。

如果你之后想尝试更轻量的方法,也可以看看用数组(比如 int cnt[128])来统计字符,对于这类字符范围固定的题目,执行效率可能会更高一些。

继续加油,期待在社区看到你更多的思考和进步 🙂
0