它要我们统计每个字符出现的个数,所以会想到使用map有一个键值对,一个key为char类型,一个value为int类型,这样我们可以得到每个字符的出现次数,又因为它让出现次数多的先输出,所以会想到使用sort从大到小排列,但我试了,sort貌似无法对map使用,所以可以将map导入到一个vector中vector内存的是pair<char,int>类型,因为map内也是用pair实现的,所以可以实现这样的操作,然后对map进行排序从大到小,这样出现次数多的我们将它先存入一个字符串ans其中,再将其返回即可
class Solution {
public:string frequencySort(string s) {map<char,int> mp;for(auto &ele : s){mp[ele]++;}vector<pair<char,int>> v;for(auto &ele : mp){v.push_back(ele);}//vector中会存在很多个键值对sort(v.begin(),v.end(),[](const pair<char,int> &a,const pair<char, int>&b){return a.second > b.second;});string ans;for(auto &[ch,num] : v){for(int i = 0; i < num; i++){ans.push_back(ch);}}return ans;}
};
总结
1.本体多次使用了遍历,遍历可以理解为一个for循环从头开始,字符串s,map,甚至是存着pair的vector都能遍历,但要注意格式,尤其是第三个&和[]值得注意
for(auto &[ch,num] : v){for(int i = 0; i < num; i++){ans.push_back(ch); }
}
2.push_back的使用,不仅vector可用,字符串也可以用
3.sort的使用,写比较函数cmp的格式值得注意,力扣比较特殊,用洛谷的时候一般会再主函数外单独写一个 bool cmp函数,但力扣里貌似不行,所以只能写成这种不太好看的样子,cmp中如果返回一代表不用交换位置,从代码来理解,大于号就表示从大到小排列,这里是按second也就是int的值来排列
//洛谷写法
bool cmp(const pair<char,int> &a,const pair<char,int> &b){return a.second > b.second;
}
sort(v.begin(),v.end(),cmp);