牛客:HJ26 字符串排序[华为机考][map]
学习要点
- multimap.equal_range
题目链接
字符串排序_牛客题霸_牛客网
题目描述
解法:multimap
#include <bits/stdc++.h>
#include <cctype>
#include <iostream>
#include <unordered_map>
using namespace std;int main() {string line_big_str;getline(cin,line_big_str);multimap<char,vector<int>> ch_bool_pos_map;vector<char> ret_ch(line_big_str.size(),'a');for(int i = 0;i<line_big_str.size();i++){if(islower(line_big_str[i])){// 构造值数组vector<int> tv;tv.push_back(1); tv.push_back(i);// 构造键值对:小写字母ch_bool_pos_map.insert({line_big_str[i],tv});}else if(isupper(line_big_str[i])){// 构造值数组vector<int> tv;tv.push_back(0); tv.push_back(i);// 构造键值对:大写字母ch_bool_pos_map.insert({tolower(line_big_str[i]),tv});}else {// 确定非字母字符位置ret_ch[i] = line_big_str[i];}}// 写入ret_chvector<char> t_ret;for(char ch = 'a';ch<='z';ch++){auto it1 = ch_bool_pos_map.find(ch);if(it1 == ch_bool_pos_map.end()){continue;}else{// 构造单桶mapauto it2 = ch_bool_pos_map.equal_range(ch);map<int,char> zi_map;for(auto i = it2.first;i != it2.second;i++){zi_map[i->second[1]] = i->second[0] == 1 ? ch : toupper(ch);}// 填入t_retfor(auto& i: zi_map){t_ret.push_back(i.second);}}}// 写入ret_chfor(int i = ret_ch.size() -1;i>=0;i--){if(ret_ch[i] != 'a')continue;ret_ch[i] = t_ret.back();t_ret.pop_back();}// 开始打印for(auto& i: ret_ch){cout << i;}
}// 64 位输出请用 printf("%lld")