根据字符出现频率排序

这类问题主要用到lambda排序

import collections
m=collections.Counter(s)
m=sorted(m.items(),key=lambda x: -x[1])
map<char, int> mm; // 统计频次
for (auto &i:s) {
    mm[i] += 1;
}
vector<pair<char,int>> v(mm.begin(), mm.end());
sort(v.begin(),v.end(),[](pair<char,int>&a,pair<char,int>&b){
    return a.second>b.second; // 按值逆序排序
});

451. 根据字符出现频率排序

  • 统计s的频次并存入字典
  • 将字典转成向量,并把该向量按值的逆序排序
  • 根据排好序的向量,按键和值生成每个子字符串,并将其加到res结果中
class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        import collections
        m=collections.Counter(s)
        m=sorted(m.items(),key=lambda x: -x[1])
        res=""
        for i in m:
            tmp=i[0]*i[1]
            res+=tmp
        ## 或者
        # for k,v in m:
        #     tmp=k*v;
        #     res+=tmp
        return res

字典转向量,然后排序

class Solution {
public:
    string frequencySort(string s) {
        map<char, int> mm; // 统计频次
        for (auto &i:s) {
            mm[i] += 1;
        }
        vector<pair<char,int>> v(mm.begin(), mm.end());
        sort(v.begin(),v.end(),[](pair<char,int>&a,pair<char,int>&b){
            return a.second>b.second; // 按值逆序排序
        });
        string res="";
        for (int i = 0; i < v.size(); ++i) {
            string tmp(v[i].second,v[i].first); // 按键和值,生成每个子字符串
            res+=tmp;
        }
        return res;
    }
};

另一种写法:字典转成multimap,multimap可以自动按键升序排序

class Solution {
public:
    string frequencySort(string s) {
        map<char, int> mm; // 统计频次
        for (auto &i:s) {
            mm[i] += 1;
        }
        multimap<int,char>multim; // 键和值互相调换,multimap自动按键的升序排列
        for(auto [c,i]:mm){
            multim.insert({i,c});
        }
        string res="";
        for(multimap<int,char>::iterator it=multim.begin(); it!=multim.end();++it){
            string tmp(it->first,it->second);
            res+=tmp; // 拼接字符串
        }
        reverse(res.begin(), res.end()); // 反转
        return res;
    }
};

347. 前 K 个高频元素

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        map<int, int> mm; // 统计频次
        for (auto &i:nums) {
            mm[i] += 1;
        }
        vector<pair<int,int>> v(mm.begin(), mm.end());
        sort(v.begin(),v.end(),[](pair<int,int>&a,pair<int,int>&b){
            return a.second>b.second; // 按值逆序排序
        });
        vector<int>res;
        for (int i = 0; i < k; ++i) {
            res.push_back(v[i].first);
        }
        return res;
    }
};

692. 前K个高频单词

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> mm; // 统计频次
        for (auto &i:words) {
            mm[i] += 1;
        }
        vector<pair<string,int>> v(mm.begin(), mm.end());
        sort(v.begin(),v.end(),[](pair<string,int>&a,pair<string,int>&b){
            if (a.second==b.second){
                return a.first<b.first;
            }
            return a.second>b.second; // 按值逆序排序
        });
        vector<string>res;
        for (int i = 0; i < k; ++i) {
            res.push_back(v[i].first);
        }
        return res;
    }
};

   转载规则


《根据字符出现频率排序》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第零章:单链表的六大解题套路,你都见过么? 第零章:单链表的六大解题套路,你都见过么?
labuladong单链表的六大解题套路,你都见过么? 21. 合并两个有序链表方法1:迭代 逐个比较节点,不断向后移动,最后把未比较过的节点拼接到尾巴上 添加一个dummy节点便于操作 /** * Definition for sin
2021-09-09
下一篇 
用栈实现队列 用栈实现队列
面试题09. 用两个栈实现队列 栈A用于加入元素 栈B用于反转元素。栈顶元素就是队头元素。删除队头时 先判断 B 是否为空,只要 B 不为空, 无论 A 是否为空都是从 B 弹出元素 B为空时 若A为空,则返回-1 若A不为空,则将其转反转
2021-09-04
  目录