题解 | #字符统计#

字符统计

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")

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司10个岗位
点赞 评论 收藏
分享
06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
昨天 16:00
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务