61根據字元出現頻率排序(451)
阿新 • • 發佈:2020-09-09
作者:
晚於: 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; }