华为面试:
按照指定规则对输入的字符串进行处理。
详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。
对排序后的字符串进行操作,如果字符为‘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复制

京公网安备 11010502036488号