题解 | #字符串合并处理#
字符串合并处理
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")