一、题目
二、解题思路
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;
}