根据字符出现频率排序 (哈希表,map,cmp,sort,遍历)

本文介绍了如何在C++中通过map统计字符出现次数,随后将map转换为vector并按出现次数降序排序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

它要我们统计每个字符出现的个数,所以会想到使用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);
4.哈希表的理解,其实是翻译的锅,翻译为散列表其实会更好理解,哈希表本质上是一个数组,提供键值对进行查询key和value,比方说一个电话簿,存着王3的电话111,李6的电话666,在哈希表中王3会被转化为王对应着111,李6转化为李对应着666但这样会存在一个问题,此时又来了一个王5的电话555怎么办,此时王既对应着111又对应着555,我们有两个解决办法一个是开放寻址法,就是在后面空的地方再放上王5,另外一个是拉链法,用一个链表连接着王3和王5,一个链不仅存着key和value,还有着一个next指针,指向下一个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值