题解 | #字符串合并处理#

字符串合并处理

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")

全部评论
其实还是不严谨,在2转16时,若开头为0000,那需要再往下判断4位是否为0000.直到结束
点赞 回复 分享
发布于 2023-05-18 01:58 广东

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
穿件外套出门:这简历一眼太水了,前面有的没的直接删,写项目亮点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务