力扣练习——61 根据字符出现频率排序
作者:互联网
1.问题描述
给定一个字符串,请将字符串里的字符按照出现的频率降序排列,如果频率相同,则按照字符的ASCII码升序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前,而且'r'比't'的ASCII码小。
示例 2:
输入:
"cccaaa"
输出:
"aaaccc"
解释:
'c'和'a'都出现三次。因此按照字符升序排列,'a'在'c'前。
示例 3:
输入:
"Aabb"
输出:
"bbAa"
解释:
'A'和'a'被认为是两种不同的字符,并且'A'的ASCII码比'a'小
2.输入说明
输入一个字符串
3.输出说明
输出一个字符串,字符串中字符的顺序请参考以上说明。
4.范例
输入
Aabb
输出
bbAa
5.代码
#include<iostream> #include<map> #include<string> #include<unordered_map> #include<algorithm> using namespace std; bool cmp(pair<char, int> a, pair<char, int>b) { return a.second == b.second?a.first<b.first:a.second>b.second;//该题目中最关键的部分,注意写法! } string OrderbyChar(string s) { //给定一个字符串,请将字符串里的字符按照出现的频率降序排列,如果频率相同,则按照字符的ASCII码升序排列。 string res;//结果字符串 unordered_map<char, int>hash;//记录每个字符出现次数 vector<pair<char, int> > v;//使用pair记录对应关系 for (auto c : s)//遍历字符串 hash[c]++; for (auto it : hash) v.emplace_back(it);//直接将每个hash元素插入v中 sort(v.begin(), v.end(), cmp); for (int i = 0; i < v.size(); i++) { while (v[i].second--) res += v[i].first; } return res; } int main() { string s; cin >> s; string res = OrderbyChar(s); cout << res << endl; return 0; }
标签:字符,include,string,力扣,61,second,字符串,排序,ASCII 来源: https://www.cnblogs.com/juillard/p/16563064.html