一、题目
二、解题思路
1、使用map,key为元素,value为出现的次数
2、由于sort不适用于map,因此要将map的key、value放到vector中,再对vector排序
3、对map排序:方法1:使用二维数组vector<vector<>>,方法2:使用一维数组vector<pair<>>
4、注意此题使用的是pair,因此要使用make_pair
三、代码
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
vector<string>split(string params) {
vector<string>p;
while (params.find(" ") != string::npos) {
int found = params.find(" ");
p.push_back(params.substr(0, found));
params = params.substr(found + 1);
}
p.push_back(params);
return p;
}
bool comp(pair<char, int>a, pair<char, int>b) {
if (a.second != b.second) {
return a.second > b.second; //优先按次数降序排
}
else { //出现次数相同的话,则再按照ASCII码降序排
return a.first > b.first;
}
}
int main() {
string input_str;
getline(cin, input_str);
vector<string>input_vec = split(input_str);
int num = stoi(input_vec[0]); //每次取几个值
int len = stoi(input_vec[1]); //每次切割字符串的新增长度
int nums = input_vec[2].size() / len; //总共切几次
string res = "";
for (int i = 0; i < nums; i++) {
string temp = input_vec[2].substr(0, len * (i + 1)); //每次切割的字符串
//key为元素,value为出现的次数
map<char, int>temp_map;
for (int j = 0; j < temp.size(); j++) {
if (temp_map.count(temp[j])) {
temp_map[temp[j]]++;
}
else {
temp_map[temp[j]] = 1;
}
}
vector<pair<char, int>>temp_vec; //由于要排序,所以将map的值放进数组中方便排序
for (auto x : temp_map) {
temp_vec.push_back(make_pair(x.first, x.second)); //注意此时的make_pair
}
sort(temp_vec.begin(), temp_vec.end(), comp);
for (int k = 0; k < num; k++) {
res += temp_vec[k].first; //排序完后的数组取num个值,由于是pair注意使用.first,.second则表示元素出现的次数
}
}
cout << res;
return 0;
}