题目: 字符统计
题目描述
如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口: 输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用) 按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出 清空目前的统计结果,重新统计
调用者会保证: 输入的字符串以‘\0’结尾。
输入描述:
输入一串字符。
输出描述:
对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出。如果有其他字符,则对这些字符不用进行统计。
输入例子:
1
aadddccddc
输出例子:
1
dca
在线提交网址: http://www.nowcoder.com/practice/c1f9561de1e240099bdb904765da9ad0?tpId=37&tqId=21325&rp=&ru=/ta/huawei&qru=/ta/huawei/question-ranking
分析:
使用一个hash表(unordered_map)存储 <字符, 出现次数>
的键值对, 然后按出现次数count进行排序(C++算法库中的sort函数), 排序时注意当统计的个数相同时, 按照ASII码由小到大顺序输出.
下面是已AC代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(pair<char,int> a, pair<char,int> b) // 重载sort函数的自定义比较函数comp
{
if(a.second > b.second)
return true;
else if(a.second == b.second && a.first < b.first)
return true;
else return false;
}
int main()
{
string str;
unordered_map<char, int> countMap;
while(getline(cin,str))
{
for(int i=0; i <= str.length()-1; i++)
{
if(countMap.find(str[i]) == countMap.end())
{
countMap[str[i]] = 1;
}
else
{
countMap[str[i]]++;
}
}
vector<pair<char, int>> elems(countMap.begin(), countMap.end());
sort(elems.begin(), elems.end(), comp); // 使用sort对hash表进行排序
for(vector<pair<char, int>>::iterator it=elems.begin(); it != elems.end(); it++)
{
cout<<it->first;
}
cout<<endl;
countMap.clear();
}
return 0;
}
1
2
3
4
测试用例1: 8v26ktzk069lm400061m0v965we88850o6omqi532ktir6esb55t0kqm026y8rk63aj82kcx48gd1tiylvs0xo32zem65q7z5ce2185d2ascz62a2p3ajr45h637t2p290lc043gicp5ldzzmx2
测试用例2:
aadddccddc
参考: http://stackoverflow.com/questions/31323135/sort-an-unordered-map-using-sort
版权声明
- 本文作者:极客玩家大白
- 本文链接:https://geekplayers.com/char-count-hard-solution.html
- 郑重声明:本文为博主原创或经授权转载的文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请留言。
Show Disqus Comments