它要我们统计每个字符出现的个数,所以会想到使用map有一个键值对,一个key为char类型,一个value为int类型,这样我们可以得到每个字符的出现次数,又因为它让出现次数多的先输出,所以会想到使用sort从大到小排列,但我试了,sort貌似无法对map使用,所以可以将map导入到一个vector中vector内存的是pair类型,因为map内也是用pair实现的,所以可以实现这样的操作,然后对map进行排序从大到小,这样出现次数多的我们将它先存入一个字符串ans其中,再将其返回即可

class Solution {

public:

string frequencySort(string s) {

map mp;

for(auto &ele : s){

mp[ele]++;

}

vector> v;

for(auto &ele : mp){

v.push_back(ele);

}

//vector中会存在很多个键值对

sort(v.begin(),v.end(),[](const pair &a,const pair&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 &a,const pair &b){

return a.second > b.second;

}

sort(v.begin(),v.end(),cmp);

4.哈希表的理解,其实是翻译的锅,翻译为散列表其实会更好理解,哈希表本质上是一个数组,提供键值对进行查询key和value,比方说一个电话簿,存着王3的电话111,李6的电话666,在哈希表中王3会被转化为王对应着111,李6转化为李对应着666但这样会存在一个问题,此时又来了一个王5的电话555怎么办,此时王既对应着111又对应着555,我们有两个解决办法一个是开放寻址法,就是在后面空的地方再放上王5,另外一个是拉链法,用一个链表连接着王3和王5,一个链不仅存着key和value,还有着一个next指针,指向下一个

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。