华为机试在线训练_字符串合并处理(字符串、排序)

字符串合并处理

http://www.nowcoder.com/questionTerminal/d3d8e23870584782b3dd48f26cb39c8f

/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
2020-03-23
字符串合并处理
*/
#include <iostream>
#include <algorithm>
using namespace std;
//字符串合并处理的函数接口
void Process_String(string str1, string str2, string strOutput)
{
    //字典法:只考虑 '0' 到 '9' ,'a' 到 'f','A' 到 'F' 的字符即可,其余字符不做改变,照原输出
    char Intput[] = {"0123456789abcdefABCDEF"}; //输入参照字典(数字 + 大小写字母)
//    int Output[] = "084c2a6e195d3b7f5d3b7f"; //输出参照字典(小写)
    char Output[] = {"084C2A6E195D3B7F5D3B7F"}; //输出参照字典(数字 + 大写字母)
    strOutput = str1 + str2; //合并两个字符串
    string odd_str; //下标为奇数的字符组成的字符串,奇数位字符串
    string even_str; //下标为偶数的字符串组成的字符串,偶数位字符串
    //根据字符在合并字符串中的次序,按字典序分奇数位、偶数位独立来排,但次序的奇偶性不变,即原来是奇数位,排序后还是奇数位
    for (int i = 0; i < strOutput.size(); i++)
    {
        if (i % 2 == 0)
        {
            odd_str += strOutput[i];
        }
        else if (i % 2 == 1)
        {
            even_str += strOutput[i];
        }
    }
    sort(odd_str.begin(), odd_str.end()); //奇排序
    sort(even_str.begin(), even_str.end()); //偶排序
    //将按奇数位、偶数位排序后的字符再填回合并字符串 strOutput
    int j = 0; //奇数位字符串的下标
    int k = 0; //偶数位字符串的下标
    for (int i = 0; i < strOutput.size(); i++)
    {
        if (i % 2 == 0)
        {
            strOutput[i] = odd_str[j];
            j++;
        }
        else if (i % 2 == 1)
        {
            strOutput[i] = even_str[k];
            k++;
        }
    }
    //对字符(符合字典 Input[])所代表的 16 进制的数进行 BIT 倒序的操作,并转换为相应的大写字符
    for (int i = 0; i < strOutput.size(); i++)
    {
        if ((strOutput[i] >= '0') && (strOutput[i] <= '9'))
        {
            strOutput[i] = Output[strOutput[i] - '0'];
        }
        else if ((strOutput[i] >= 'a') && (strOutput[i] <= 'f'))
        {
            strOutput[i] = Output[strOutput[i] - 'a' + 10];
        }
        else if ((strOutput[i] >= 'A') && (strOutput[i] <= 'F'))
        {
            strOutput[i] = Output[strOutput[i] - 'A' + 16];
        }
    }
    cout << strOutput << endl;
    return;
}
//主函数
int main()
{
    string str1, str2, strOutput;
    while (cin >> str1 >>str2)
    {
        Process_String(str1, str2, strOutput);
    }
    return 0;
}
大厂面试 文章被收录于专栏

分享有用的面试经历,倾吐有心的面试感悟,讲述有趣的面试故事,以飨读者。 常用语言是C++,编程力求规范整洁,题解清晰完整,像写诗一样去写代码。 本专栏文章系「人工智能安全」(微信公众号)原创,转载请联系本文作者。 欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。 我是一名有诗人气质的网络安全工程师,期待与你的思想交流碰撞出智慧的花火。

全部评论
题目完全是垃圾,根本没交代题目的输入合法性,以及非法输入要不要处理,实际上这题非常坑爹。根本没提到我必须要处理F以外的输入。那我要不要处理输入字符是空字符串情况,要不要处理只输入了1组字符串的情况,要不要自己测试处理所有非法输入情况?
7 回复 分享
发布于 2021-12-01 11:03
奇数位和偶数位,是不是代码写的和语言表达写反了,if (i % 2 == 0),怎么能代表奇数位呢
点赞 回复 分享
发布于 2021-08-28 21:33
#include <algorithm> #include <cctype> #include <iostream> #include <string> #include <vector> using namespace std; int main() { string s1, s2; //0110 string str1 = "0123456789abcedfABCEDF"; string str2 = "084C2A6E195D37BF5D37BF"; while (cin >> s1 >> s2) { vector<char> v1(s1.size()), v2(s2.size()); string strOout = s1 + s2; string odd, even; for (int i = 0; i < strOout.size(); i++) { if (i % 2 == 0) { even += strOout[i]; } else { odd += strOout[i]; } } sort(odd.begin(), odd.end()); sort(even.begin(), even.end()); //cout <<odd><< ":" <<even><<endl>= '0' && strOout[i] <= '9') || (toupper(strOout[i]) >= 'A' && toupper(strOout[i]) <= 'F')) { strOout[i] = str2[str1.find_last_of(strOout[i])]; } } cout << strOout << endl; } } // 64 位输出请用 printf("%lld")</endl></even></odd></char></vector></string></iostream></cctype></algorithm>
点赞 回复 分享
发布于 2023-08-03 23:20 浙江
在大佬的基础上改了一下,56-69行代码,我缩减了一下,嘻嘻
点赞 回复 分享
发布于 2023-08-03 23:20 浙江

相关推荐

我即大橘:耐泡王
点赞 评论 收藏
分享
评论
36
4
分享
牛客网
牛客企业服务