字符统计
算法知识视频讲解
中等 通过率:27.48% 时间限制:1秒 空间限制:32M
知识点
字符串
排序
题目
题解(36)
讨论(424)
排行
warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
本题含有多组样例输入
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
示例1
输入:
aaddccdc
1b1bbbbbbbbb
复制
输出:
cda
b1
复制
说明:
第一个样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
using namespace std;
struct OutMapPairStru {
char a;
int counter;
};
bool compareDes(OutMapPairStru outMapPairStru1,OutMapPairStru outMapPairStru2){
// ASCII
if(outMapPairStru1.counter == outMapPairStru2.counter){
return outMapPairStru1.a < outMapPairStru2.a; //从小到大
}
// 降序:从大到小
if (outMapPairStru1.counter > outMapPairStru2.counter) {
return true;
}
return false;
}
/*
* 迭代
* 思路:英文字母a~z共26个,从一个字母开始计算,如果重复出现,则累计加1;再对对其进行排序,当出现的次数相同,
* 则根据ASCII的顺序进行排序
* 步骤:
* 第一步:输入一个字符串getline(cin, strIn);
* 第二步:若查找find字母重复出现,则累计加1--map
* 第三步:map转vector,对其进行排序,若字母出现次数相同,则根据ASCII进行排序
*/
void counterStr(string strIn)
{
map<char, int> outMap;
int strInLen = strIn.size();
//第二步:若字母重复出现,则累计加1;
for(int i = 0; i < strInLen; i++) {
auto iter = outMap.find(strIn[i]);
if(iter != outMap.end()) {
outMap[strIn[i]] = outMap[strIn[i]] + 1;
} else {
// outMap.emplace(pair<char, int>(strIn[i], 1));
//outMap.emplace(make_pair(strIn[i], 1));
outMap.insert(make_pair(strIn[i], 1));
}
}
//vector<pair<char, int>> outVec(outMap.begin(), outMap.end());
//sort(outVec.begin(), outVec.end(), compareDes);
vector<OutMapPairStru> outMapPairStrucVec;
for(auto iter2 = outMap.begin(); iter2 != outMap.end(); iter2++) {
OutMapPairStru outMapPairStru;
outMapPairStru.a = iter2->first;
outMapPairStru.counter = iter2->second;
outMapPairStrucVec.emplace_back(outMapPairStru);
}
//sort(outMapPairStrucVec.begin(), outMapPairStrucVec.end()) // 默认为升序,从小到大
sort(outMapPairStrucVec.begin(), outMapPairStrucVec.end(), compareDes);
for(int i = 0; i < outMapPairStrucVec.size(); i++) {
cout<< outMapPairStrucVec[i].a;
}
cout<<endl;
outMapPairStrucVec.clear();
}
int main()
{
string strIn;
while(getline(cin, strIn)) {
counterStr(strIn);
}
return 0;
} 
京公网安备 11010502036488号