华为面试:
按照指定规则对输入的字符串进行处理。

详细描述:

将输入的两个字符串合并。

对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。

对排序后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。


举例:输入str1为"dec",str2为"fab",合并为“decfab”,分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”

注意本题含有多组样例输入
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
char cto2(char c)//字符转换
{
    int num=0,i;
    bool tmp[4];
    int tmp1[4];
    int sum=0;
    char C=c;
    if(c>='0'&&c<='9')
        num=c-'0';
    else if(c>='a'&&c<='f')
    {
        num=c-'a'+10;
    }else if(c>='A'&&c<='F')
    {
        num=c-'A'+10;
    }else
    {
        return c;//其他字符,原路退回
    }
    for(i=0;i<4;i++)
    {
        tmp[i]=num&(0x01<<i);//按位或求二进制
    }
    for(i=0;i<4;i++)
    {
        tmp1[i]=tmp[3-i];//BIT倒序转换
    }
    for(i=0;i<4;i++)
    {
        sum+=tmp1[i]*pow(2,i);//换算成10进制
    }
    if(sum>=0&&sum<=9)
    {
        C='0'+sum;//转换为ASCII码
    }else if(sum>=10&&sum<=15)
    {
        C='A'+sum-10;//转换为ASCII码
    }
    return C;
}
void fun(string str1,string str2)//字符串合并+转换
{
    int i=0,j=0;
    string str=str1+str2;
    char*p=(char*)str.data();
    int n=str.length();//合并后字符串长度
    int tmp=(n+1)/2;//奇数的个数
    char buf[n];//存放转换后的字符数组
    char buf1[tmp];//存放地址为奇数字符的数组
    char buf2[n-tmp];//存放地址为偶数字符的数组
    char buf3[n];//存放奇偶排序后合并
    for(i=0;i<n;i++)
    {
        buf1[j]=*(p+i);
        i++;
        buf2[j]=*(p+i);
        j++;
    }
    sort(buf1,buf1+tmp);//奇数排序
    sort(buf2,buf2+n-tmp);//偶数排序
    j=0;
    for(i=0;i<n;i++)//奇偶合并进buf3
    {
        buf3[i]=buf1[j];
        i++;
        if(i>=n)//当字符串长度为奇数时,防止越界,及时退出
            break;
        buf3[i]=buf2[j];
        j++;
    }
    for(i=0;i<n;i++)
    {
         buf[i]=cto2(buf3[i]);//将转换后的数据存入buf
    }
    for(i=0;i<n;i++)
    {
        printf("%c",buf[i]);//之间用%s输出会出错--大坑
    }
    printf("\n");
    return;
}
int main()
{
    
    while(1)//多组数据,轮询判断
    {
        string str[2];
        cin>>str[0];
        cin>>str[1];
        if(str[0].empty())
            break;
        if(str[2].empty())
            break;
       fun(str[0],str[1]);
    }
    
    return 0;
}



输入描述:

本题含有多组样例输入。每组样例输入两个字符串,用空格隔开。

输出描述:

输出转化后的结果。每组样例输出一行。

示例1

输入:
dec fab
复制
输出:
5D37BF
复制