问题描述
c++ STL中的map会根据key进行自动排序,但某些场合需要根据value进行排序。例如,算法题字符统计。
描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
数据范围:字符串长度满足 1≤len(str)≤1000
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
示例1
输入:
aaddccdc
输出:
cda
说明:
c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
这种场景非常适合使用map容器记录每个字符出现的次数,然后针对出现次数进行降序排列,输出对应字符即可。但如何对value进行排序呢?
解决方案:
本篇记录一种结合
vector
容器和sort()
函数的方法:
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
// 1.构造一个符合背景问题的map
map<char, int> m;
m['a'] = 2;
m['c'] = 3;
m['b'] = 1; // 此时m已根据key自动升序排列,即 m={'a':2, 'b':1, 'c':3}
// 2.根据map构造一个vector数组
vector<pair<char, int>> v(m.begin(), m.end()); // v有序排列
// 3.调用头文件<algorithm>中的sort()或者stable_sort()排序函数,,二者调用方式相同
// stable_sort()具有排序稳定性,此处以它为例,降序排列
stable_sort(v.begin(), v.end(), [](const pair<char, int>& a, const pair<char, int>& b) {
return a.second > b.second;
}); // 仿函数形参中的const关键字不可省略,否则报错
// 4.打印输出
for (auto i : v) {
cout << i.first << " " << i.second << endl;
}
return 0;
}
输出结果: