每次来牛客做题都是来爬坑了。。。坑坑更健康!!
这题目描述漏了几个关键信息:
1.合并后的字符串按照奇偶位拆分后分别排序,排序后原合并字符串中的奇数位在新拼接的字符串中也只能是奇数位,原合并字符串中的偶数位在新拼接的字符串中也只能是偶数位;
2.反转的时候只处理十六进制样式的字符,其他字符保持不变;
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>
#include <sstream>
using namespace std;
string merge(const string s1, const string s2) {
string ans = s1 + s2;
int size = ans.size();
// 按奇偶拆分字符串,分别排序
string even, odd;
for (int i = 0; i < size; ++i) {
i & 1 ? odd.push_back(ans[i]) : even.push_back(ans[i]);
}
sort(even.begin(),even.end());
sort(odd.begin(),odd.end());
ans.clear();
for (int i = 0, p = 0, q = 0; i < size; ++i) {
// 合并时按照原来的奇偶顺序排列
i & 1 ? ans.push_back(odd[p++]) : ans.push_back(even[q++]);
}
return ans;
}
int to_int(char c) {
if (c >= '0' && c <= '9') return c - '0';
else if (c >= 'A' && c <= 'F') return c - 'A' + 10;
else if (c >= 'a' && c <= 'f') return c - 'a' + 10;
return -1;
}
char reverse_bits(int val) {
unsigned char m = 0x5;
val = val >> 1 & m | (val & m) << 1;
val = val >> 2 | val << 2;
val %= 16;
return val < 10 ? val + '0' : val - 10 + 'A';
}
int main() {
string word1,word2;
while (cin >> word1 >> word2)) {
string ans;
for (const auto &c : merge(word1,word2)) {
int r = to_int(c);
// 只处理十六进制字符,其他直接添加
if (r >= 0 && r <= 15)
ans.push_back(reverse_bits(r));
else ans.push_back(c);
}
cout << ans << endl;
}
return 0;
} 
京公网安备 11010502036488号