当前位置: 首页 > article >正文

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

它要我们统计每个字符出现的个数,所以会想到使用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指针,指向下一个

http://www.kler.cn/a/159127.html

相关文章:

  • 计算机使用常用工具(持续更新)
  • SQL面试题——抖音SQL面试题 最大在线用户数
  • 【机器学习导引】ch6-支持向量机
  • 网络基础(4)传输层
  • (一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境
  • [GXYCTF2019]BabyUpload--详细解析
  • 微服务学习(十三):安装Consul
  • L.next与L->next
  • Linux--初识和基本的指令(3)
  • Linux socket编程(11):Unix套接字编程及通信例子
  • 把 Windows 11 装进移动硬盘:Windows 11 To Go
  • 报错:Parsed mapper file: ‘file mapper.xml
  • Java中迭代Map和List最简单直接办法
  • Kafka 生产者 API 指南:深入理解生产者的实现与最佳实践
  • Python智能语音识别语翻译平台|项目后端搭建
  • 前端时间的失败总结复盘
  • 深度学习在单线性回归方程中的应用--TensorFlow实战详解
  • 十二、FreeRTOS之FreeRTOS任务相关API函数
  • 电子学会C/C++编程等级考试2023年03月(四级)真题解析
  • 12、组合模式(Composite Pattern,不常用)
  • javascript object转换成json格式
  • github首次将文件合到远端分支,发现名字不是master,而是main
  • 【Java 基础】20 多线程操作方法
  • 如何选呼叫中心的语音通道?
  • WordPiece词表的创建
  • Demystifying DeFi MEV Activities in Flashbots Bundle