字符统计
算法知识视频讲解
中等 通过率: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; }