题解 | #字符串合并处理#
字符串合并处理
https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using namespace std;
bool Compare(char a, char b){
return a<b;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
// 合并
string s = s1 + s2;
int len = size(s);
vector<char> odd, even;
for(int i = 0; i < len; i ++){
if(i%2 == 0)
even.push_back(s[i]);
else
odd.push_back(s[i]);
}
// 排序
sort(odd.begin(), odd.end(), Compare);
sort(even.begin(),even.end(), Compare);
// 转换:16转2
// 注意要翻转,所以插入最前端并且按照翻转2进制插入
// 不是0~9,a~f,A~F的其他字符不进行转换操作,但是为了保证能被之后2转16时正确扫描
// 也要插入最前端,保持4位
string temp;
for(int i = 0,j = 0; i < size(even) || j < size(odd); i ++, j ++){
if(i < size(even)){
switch (even[i]) {
case '0': temp.insert(0,"0000");break;
case '1': temp.insert(0, "1000");break;
case '2': temp.insert(0, "0100");break;
case '3': temp.insert(0, "1100");break;
case '4': temp.insert(0, "0010");break;
case '5': temp.insert(0, "1010");break;
case '6': temp.insert(0, "0110");break;
case '7': temp.insert(0, "1110");break;
case '8': temp.insert(0, "0001");break;
case '9': temp.insert(0, "1001");break;
case 'a': temp.insert(0, "0101");break;
case 'A': temp.insert(0, "0101");break;
case 'b': temp.insert(0, "1101");break;
case 'B': temp.insert(0, "1101");break;
case 'C': temp.insert(0, "0011");break;
case 'c': temp.insert(0, "0011");break;
case 'D': temp.insert(0, "1011");break;
case 'd': temp.insert(0, "1011");break;
case 'e': temp.insert(0, "0111");break;
case 'E': temp.insert(0, "0111");break;
case 'f': temp.insert(0, "1111");break;
case 'F': temp.insert(0, "1111");break;
default:
string not_16;
not_16.append(4,even[i]);
temp.insert(0,not_16);
}
}
if(j < size(odd)){
switch (odd[j]) {
case '0': temp.insert(0,"0000");break;
case '1': temp.insert(0, "1000");break;
case '2': temp.insert(0, "0100");break;
case '3': temp.insert(0, "1100");break;
case '4': temp.insert(0, "0010");break;
case '5': temp.insert(0, "1010");break;
case '6': temp.insert(0, "0110");break;
case '7': temp.insert(0, "1110");break;
case '8': temp.insert(0, "0001");break;
case '9': temp.insert(0, "1001");break;
case 'a': temp.insert(0, "0101");break;
case 'A': temp.insert(0, "0101");break;
case 'b': temp.insert(0, "1101");break;
case 'B': temp.insert(0, "1101");break;
case 'C': temp.insert(0, "0011");break;
case 'c': temp.insert(0, "0011");break;
case 'D': temp.insert(0, "1011");break;
case 'd': temp.insert(0, "1011");break;
case 'e': temp.insert(0, "0111");break;
case 'E': temp.insert(0, "0111");break;
case 'f': temp.insert(0, "1111");break;
case 'F': temp.insert(0, "1111");break;
default:
string not_16;
not_16.append(4,odd[j]);
temp.insert(0,not_16);
}
}
}
// 转换:2转16。每四位读取一次,需要注意若开头四位都是0000,则说明首位为0,不显示,就要做判断
string res;
int begin = (temp.substr(0,4) == "0000")?4:0;
for(int i = begin; i < size(temp); i +=4){
string sub = temp.substr(i,4);
if(sub == "0000") res.insert(res.begin(), '0');
else if(sub == "0001") res.insert(res.begin(), '1');
else if(sub == "0010") res.insert(res.begin(), '2');
else if(sub == "0011") res.insert(res.begin(), '3');
else if(sub == "0100") res.insert(res.begin(), '4');
else if(sub == "0101") res.insert(res.begin(), '5');
else if(sub == "0110") res.insert(res.begin(), '6');
else if(sub == "0111") res.insert(res.begin(), '7');
else if(sub == "1000") res.insert(res.begin(), '8');
else if(sub == "1001") res.insert(res.begin(), '9');
else if(sub == "1010") res.insert(res.begin(), 'A');
else if(sub == "1011") res.insert(res.begin(), 'B');
else if(sub == "1100") res.insert(res.begin(), 'C');
else if(sub == "1101") res.insert(res.begin(), 'D');
else if(sub == "1110") res.insert(res.begin(), 'E');
else if(sub == "1111") res.insert(res.begin(), 'F');
else res.insert(res.begin(), sub[0]);
}
cout << res << endl;
}
// 64 位输出请用 printf("%lld")
查看12道真题和解析