zoukankan      html  css  js  c++  java
  • 451. 根据字符出现频率排序 力扣(中等) 结构体+优先队列+map,一直tle找到原因了

    题目描述:

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

    示例 1:

    输入:
    "tree"

    输出:
    "eert"

    解释:
    'e'出现两次,'r'和't'都只出现一次。
    因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

    题源:https://leetcode-cn.com/problems/sort-characters-by-frequency/

    注意点:

    1. priority_queue和sort中比较函数写法不同,具体如下:
    2. 队列的比较函数,是需要有一个结构体的。
          struct node
              {
                  char ch;
                  int ti;
                  node(char a,int b) {ch=a; ti=b;}
              };
           struct cmp
          {
              bool operator()(node a,node b)
              {
                  if(a.ti!=b.ti) return a.ti<b.ti;   //表示从大到小,是反着来的
                    else return a.ch>b.ch;
              }        
          };
      priority_queue<node,vector<node>, cmp> Q;
      
      
      而sort的比较函数是,直接一个bool型函数即可:
      static  bool cmp(node a,node b)   //需要加上static,不然报错
      {
          return a>b;   //从大到小排列。
      }
      sort(a,a+n,cmp); //  sort(a.begin(),a.end(),cmp); 
    3. map<char, int> mp,取键值用  .first,取值  .second
    4. string类型的变量,a=a+char 和 a+=char是两种效率,这题就出现了这个问题。血的教训。
    class Solution {
    public:
        struct node
            {
                char ch;
                int ti;
                node(char a,int b) {ch=a; ti=b;}
            };
        struct cmp
        {
            bool operator()(node a,node b)
            {
                if(a.ti!=b.ti) return a.ti<b.ti;
                  else return a.ch>b.ch;
            }        
        };
    
        string frequencySort(string s) {
            
            int l=s.length();
            map<char , int> mp;
            for(int i=0;i<l;i++)  mp[s[i]]++;
            
            priority_queue<node,vector<node>, cmp> Q;
            //priority_queue<node> Q;
            for(auto p : mp)  
                Q.push(node(p.first,p.second));
            
            string res;
            while(!Q.empty())
            {
                node p=Q.top();
                for(int i=0;i<p.ti;i++) res+=p.ch; //res=res+p.ch; 如果是后面这种写法,tle,相当于重新赋值,而不是在末尾加上一个字符。
                Q.pop();
            }
            return res;
        }
    };

  • 相关阅读:
    7. 阿里百秀实战
    静态布局、自适应布局、流式布局、响应式布局、弹性布局等的概念和区别
    3_2:HTTP协议
    3_1:一个浏览器如何工作的
    2.1:JavaScript数据类型
    1.3 列一份前端知识架构图
    银河麒麟V10系统安装
    WINDOWS下查看系统版本详细信息和网络连接详细信息
    银河麒麟查看/更改环境变量
    统信UOS国产化安装tcpdump命令
  • 原文地址:https://www.cnblogs.com/stepping/p/14967409.html
Copyright © 2011-2022 走看看