1. 程式人生 > 實用技巧 >61根據字元出現頻率排序(451)

61根據字元出現頻率排序(451)

作者: Turbo時間限制: 1S章節: 雜湊表

晚於: 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; }