题目描述:
算法实现:
本题主要通过哈希表进行实现,使用unordered_map实现哈希表,当然也可以使用map,两者区别在于一个有序,一个无序(简单的讲)
- 首先定义一个unordered_map<char,int> mp(<字符,出现次数>),实现哈希表,实现对string中的字符出现个数进行计数。
- map的使用方法相比大家很熟悉,这里的mp的first存储的为字符,second存储的为出现的次数。使用'.'可以直接访问。
- 为了便于输出,定义一个容器vector<pair<char,int>> vec,用于存储mp中的元素。接下来就只需要对vec进行操作了。
- 题目要求按照出现次数的大小进行输出,出现次数越大,提前输出,因此需要对vec进行排序,按照second从大到小排序,在这里题目虽然没有要求一样的出现次数如何输出,我在这里定义,出现次数相同时,按照字典序输出。
- 遍历vec,对元素进行输出。
代码实现:
class Solution {
public:
string frequencySort(string s) {
unordered_map<char, int> mp;
for (auto &ch : s) {
mp[ch]++;
}
vector<pair<char, int>> vec;
for (auto &it : mp) {
vec.push_back(it);
}
sort(vec.begin(), vec.end(), [](const pair<char, int> &a, const pair<char, int> &b) {
if(a.second==b.second){
return a.first<b.first;
}
return a.second > b.second;
});
string ret;
for (auto &ch : vec) {
for (int i = 0; i < ch.second; i++) {
ret.push_back(ch.first);
}
}
return ret;
}
};
将cmp函数定义在sort外面:
class Solution {
static bool cmp(const pair<char, int> &a, const pair<char, int> &b){
if (a.second == b.second) {
return a.first<b.first;
}
return a.second > b.second;
}
public:
string frequencySort(string s) {
unordered_map<char, int> mp;
int length = s.length();
for (auto &ch : s) {
mp[ch]++;
}
vector<pair<char, int>> vec;//利用vector对map进行排序
unordered_map<char, int>::iterator it;
for (it=mp.begin();it!=mp.end();it++) {
vec.emplace_back(*it);
}
sort(vec.begin(), vec.end(),cmp);
string ret;
vector<pair<char, int>>::iterator p;
for (p=vec.begin();p!=vec.end();p++) {
for (int i = 0; i <(*p).second; i++) {
ret.push_back((*p).first);
}
}
return ret;
}
};
我发现一个很好用的变量方法,当然也是使用for
for (auto &ch : vec)
这里的auto关键字真是太香了。