61根据字符出现频率排序(451)

作者: Turbo时间限制: 1S章节: 哈希表

晚于: 2020-08-19 12:00:00后提交分数乘系数50%

截止日期: 2020-08-26 12:00:00

问题描述 :

给定一个字符串,请将字符串里的字符按照出现的频率降序排列,如果频率相同,则按照字符的ASCII码升序排列。

 

示例 1:

输入:

"tree"

输出:

"eert"

解释:

'e'出现两次,'r'和't'都只出现一次。

因此'e'必须出现在'r'和't'之前,而且'r'比't'的ASCII码小。

 

示例 2:

输入:

"cccaaa"

输出:

"aaaccc"

解释:

'c'和'a'都出现三次。因此按照字符升序排列,'a'在'c'前。

 

示例 3:

输入:

"Aabb"

输出:

"bbAa"

解释:

'A'和'a'被认为是两种不同的字符,并且'A'的ASCII码比'a'小

 

输入说明 :

输入一个字符串

输出说明 :

输出一个字符串,字符串中字符的顺序请参考以上说明。

输入范例 :

输出范例 :

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
class Solution {
public:
    static bool cmp(pair<char,int> a,pair<char,int> b)//必须加static 
    {
        if(a.second==b.second)//
            return a.first<b.first;//个数相等,按ascii码从小到大 排 
        return a.second>b.second;//不相等时按个数从大到小排 
    }
    string frequencySort(string s) 
    {
        unordered_map<char,int> M;
        for(int i=0;i<s.size();i++)
            M[s[i]]++;
        vector<pair<char,int>> vec;
        for(auto &m:M)
            vec.push_back(m);
        sort(vec.begin(),vec.end(),cmp);
        string res;
        for(auto &t:vec)
            res+=string(t.second,t.first);//直接是几倍的字符 
        return res;
    }
};
int main()
{
    string s,res;
    cin>>s;
    res=Solution().frequencySort(s);
    cout<<res;
}

 

posted on 2020-09-09 16:54  Hi!Superman  阅读(252)  评论(0编辑  收藏  举报

导航