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