题解 | #字符统计#

字符统计

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

题目的主要信息:

输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。

方法一:

用map建立字符和次数之间的映射,首先遍历一遍字符串统计每个字符出现的次数。总共有n个字符,字符最大出现次数最大为n,从n开始往下遍历,在map中按照ASCII码的大小查找是否有该次数的字符,如果有的话把它加到res中。最后输出res。

具体做法:

#include<iostream>
#include<map>
#include<string>
#include<algorithm>

using namespace std;

int main()
{
    string str;
    map<char,int> mp;
    while(getline(cin,str))
    {    
        map<char,int> mp;
        for(int i=str.size()-1;i>=0;i--){//统计出现次数
            mp[str[i]]++;
        }
        string res;
        for(int i=str.size();i>=0;i--)//按照大小排序
        {
            for(auto x:mp)//按照ASCII码的大小遍历一遍mp
            {
                if(x.second==i){//如果有字符次数为i的则把该字符添加到res中
                    res += x.first;
                }
            }
        }
        cout<<res<<endl;
    }
    
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍字符串。
  • 空间复杂度:O(n)O(n),最坏情况下,每种字符只出现一次,mp需要n个空间。

方法二:

用map建立字符和次数之间的映射,首先遍历一遍字符串统计每个字符出现的次数。然后重载sort函数,对所有映射进行排序,出现次数较大的在前面,若出现次数相同,则ASCII码较大的字符在前面,最后输出排序后的映射的字符。 alt

具体做法:

#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<char,int> a,pair<char,int> b){
    if(a.second==b.second){//当出现次数相同时
        return a.first<b.first;//输出ASCII码较小的字符
    }
    return a.second>b.second;//输出出现次数较多的字符
}
int main(){
    string s;
    while(cin>>s){
        map<char,int> mp;
        for(int i=0;i<s.size();i++){//逐个统计字符出现次数
            mp[s[i]]++;
        }
        vector<pair<char,int> > v(mp.begin(),mp.end());
        sort(v.begin(),v.end(),cmp);//按照出现次数进行排序
        for(auto it:v){
            cout<<it.first;//按照次数大小输出
        }
        cout<<endl;
    }
}

复杂度分析:

  • 时间复杂度:O(nlog2n)O(nlog_2n),sort函数的时间复杂度为O(nlog2n)O(nlog_2n)
  • 空间复杂度:O(n)O(n),最坏情况下,每种字符只出现一次,mp需要n个空间。
全部评论
方法一的时间复杂度不是n^2吗?有嵌套循环
点赞 回复 分享
发布于 2022-06-29 00:47
应该是因为mp个数是常量:10+26=36.
点赞 回复 分享
发布于 2023-04-21 20:20 广东

相关推荐

02-08 20:56
已编辑
南京工业大学 Java
在等offer的比尔很洒脱:我也是在实习,项目先不说,感觉有点点小熟悉,但是我有点疑问,这第一个实习,公司真的让实习生去部署搭建和引入mq之类的吗,是不是有点过于信任了,我实习过的两个公司都是人家正式早搭好了,根本摸不到部署搭建的
点赞 评论 收藏
分享
浪子陪都:简历最优秀的地方放到了后面,国奖,校级奖学金这些是最亮眼的。说明你跟同级别的学生不一样。 建议台灯这个,PCB布局布线这个词汇不专业,业内是PCB Layout,第二,单片机的板子一般不用考虑SI,PI 都是低速信号,只要遵循3W原则就好了。 单片机的项目太low了,技能这块,你要看一下BOSS直聘的招聘要求,按照别人的要求写,一些关键词可以增加你简历被检索到的概率。 主修课程不用写,这个没有人去关注的。
点赞 评论 收藏
分享
评论
19
2
分享

创作者周榜

更多
牛客网
牛客企业服务