作者:
晚于: 2020-08-19 12:00:00后提交分数乘系数50%
截止日期: 2020-08-26 12:00:00
问题描述 :
给定一个字符串,请将字符串里的字符按照出现的频率降序排列,如果频率相同,则按照字符的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'小
输入说明 :
输入一个字符串
输出说明 :
输出一个字符串,字符串中字符的顺序请参考以上说明。
输入范例 :
输出范例 :
#include <iostream> #include <string> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; class Solution { public: static bool cmp(pair<char,int> a,pair<char,int> b)//必须加static { if(a.second==b.second)// return a.first<b.first;//个数相等,按ascii码从小到大 排 return a.second>b.second;//不相等时按个数从大到小排 } string frequencySort(string s) { unordered_map<char,int> M; for(int i=0;i<s.size();i++) M[s[i]]++; vector<pair<char,int>> vec; for(auto &m:M) vec.push_back(m); sort(vec.begin(),vec.end(),cmp); string res; for(auto &t:vec) res+=string(t.second,t.first);//直接是几倍的字符 return res; } }; int main() { string s,res; cin>>s; res=Solution().frequencySort(s); cout<<res; }