题解 | #字符统计#

字符统计

https://www.nowcoder.com/practice/c1f9561de1e240099bdb904765da9ad0

首先这道题需要解决两件事情:

  1. 使用map进行词频统计
  2. 使用vector对map的pair进行排序

排序又分为2个阶段:

  1. 词频由大到小排-->直接使用sort按照自定义compare函数排序
  2. 同频词按照ASCII码由小到大排-->使用双指针,对vector[start,end)段进行自定义compare函数排序
#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

bool compare(pair<char, int> pair1, pair<char, int> pair2){
    if(pair1.second > pair2.second)
        return true;
    else
        return false;
}

bool compare2(pair<char, int> pair1, pair<char, int> pair2){
    if(pair1.first < pair2.first)
        return true;
    else
        return false;
}
int main() {
    string s;
    getline(cin, s);

    int len = size(s);

    unordered_map<char, int> hash_map;
    vector<pair<char, int> > count;
    // 使用map词频统计
    for(int i = 0; i < len; i ++){
        if(hash_map.find(s[i]) == hash_map.end())
            hash_map[s[i]] = 1;
        else
            hash_map[s[i]]++;
    }
    // vector存pair
    for(auto it = hash_map.begin(); it != hash_map.end(); it++)
        count.push_back(*it);
    // 先按词频由大到小排序
    sort(count.begin(), count.end(), compare);
    
    // 再按ASCII码对同频部分进行由小到大排序
    int len2 = size(count);

    if(len2 == 1){
        cout << count[0].first << endl;
    }else{
        int ind1 = 0, ind2 = 1;
        while(ind2 <= len2){
            int val1 = count[ind1].second;
            int val2 = count[ind2].second;

            if(val1 == val2){
                ind2 ++;
            }else{
                if(ind1 != ind2 - 1)
                    sort(count.begin()+ind1, count.begin()+ind2, compare2);   
                                
                ind1 = ind2;
                ind2 ++;
            }
        }
        for(int i = 0; i < len2; i ++)
            cout << count[i].first;
        
        cout << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务