Leetcode451 Sort Characters By Frequency
阿新 • • 發佈:2018-12-28
Given a string, sort it in decreasing order based on the frequency of characters.
Example 1:
Input:
"tree"
Output:
"eert"
本題就是要把字串裡的數字按頻率降序輸出。注意題目中說,頻率相同的字母順序隨便排都是合理答案。
一看次數,直接想到雜湊表,所以我用了map,發現其實好多map不知道的基礎知識,有時間了在補一補吧。先說思路
map建立字元和出現次數的關係,map<char,int>.然後在根據value對map進行降序排列就可以了。難點就是如何降序排列。
可以先看一下這篇部落格https://blog.csdn.net/qq_26399665/article/details/52969352。基本思想就是將map放進vector中,在對vector進行排序。
排完之後直接輸出就可以,但是注意的是,輸出的時候遇到每個字元多次的要輸出多次該字元,就是在要巢狀一層迴圈,否則就只會輸出一個該字元。
AC程式碼:
class Solution { public: static bool cmp(const pair<char,int> &p1,const pair<char,int> &p2) { return p1.second>p2.second; } string frequencySort(string s) { map<char,int> m; for(int i=0;i<s.length();i++){ m[s[i]]++; } vector<pair<char,int>> arr; for (map<char,int>::iterator it=m.begin();it!=m.end();++it){ arr.push_back(make_pair(it->first,it->second)); } sort(arr.begin(),arr.end(),cmp); int i=0; for(vector<pair<char,int>>::iterator it=arr.begin();it!=arr.end();++it){ for(int j=0;j<it->second;j++){ s[i++]=it->first; } } return s; } };
今天看了另一個方法,思路一樣,但是程式碼很簡單,用了自動排序的資料結構priority_queue ,優先佇列。
定義了priority_queue<pair<int,int>>,優先佇列會自動排序,預設是降序,優先順序大的在前,符合這道題的要求。如果資料型別是pair的話,則會按pair 的first元素排序,first相同在按second排序。
所以生成pair的時候將頻率當first元素。
AC程式碼:
class Solution { public: string frequencySort(string s) { string res = ""; priority_queue<pair<int, char>> q; unordered_map<char, int> m; for (char c : s) ++m[c]; for (auto a : m) q.push({a.second, a.first}); while (!q.empty()) { auto t = q.top(); q.pop(); res.append(t.first, t.second); } return res; } };