描述
按照指定规则对输入的字符串进行处理。
详细描述:
第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" , 合并后生成的字符串为 "decfab"
第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序(生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'),再依次分别放回原串中的偶数位和奇数位,新字符串变为“abcedf”
第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
转换规则如下:
对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。
如字符 '4',其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 '2'。
如字符 ‘7’,其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 'E'。
如字符 'C',代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 '3'。
根据这个转换规则,由第二步生成的字符串 “abcedf” 转换后会生成字符串 "5D37BF"。
数据范围:输入的字符串长度满足1≤n≤100
输入描述:
样例输入两个字符串,用空格隔开。
输出描述:
输出转化后的结果。
示例1
输入:
dec fab
输出:
5D37BF
示例2
输入:
ab CD
输出:
3B5D
说明:
合并后为abCD,按奇数位和偶数位排序后是CDab(请注意要按ascii码进行排序,所以C在a前面,D在b前面),转换后为3B5D
示例3
输入:
123 15
输出:
88C4A
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
bool compare(char left,char right) // 按照ASCII码排序
{
// 不交换的情况,返回true
if(left-'0' < right-'0')
return true;
else
return false;
}
map<char,int> myMap1={
{'0',0},{'1',1},{'2',2},{'3',3},
{'4',4},{'5',5},{'6',6},{'7',7},
{'8',8},{'9',9},
{'a',10},{'A',10},
{'b',11},{'B',11},
{'c',12},{'C',12},
{'d',13},{'D',13},
{'e',14},{'E',14},
{'f',15},{'F',15}
};
map<int,char> myMap2={
{0,'0'},{1,'1'},{2,'2'},{3,'3'},
{4,'4'},{5,'5'},{6,'6'},{7,'7'},
{8,'8'},{9,'9'},
{10,'A'},
{11,'B'},
{12,'C'},
{13,'D'},
{14,'E'},
{15,'F'}
};
// 转换:都看作十六进制字符 --> 十进制 --> 二进制逆序 --> 十进制--> 十六进制字符
char transf(char c)
{
// 十六进制字符 --> 十进制数字
int num=myMap1[c];
// 十进制数字 --> 二进制逆序
vector<int> binary; //逆序二进制
while (num) {
binary.push_back(num%2);
num/=2;
}
// 如果二进制数不足4位要补0
while (binary.size()<4) {
binary.push_back(0);
}
// 二进制逆序 --> 十进制数
int result=0;
int r=1;
for(int i=binary.size()-1;i>=0;i--)
{
result+=binary[i]*r;
r*=2;
}
// 十进制数 --> 十六进制字符
return myMap2[result];
}
int main()
{
// 0.输入
char buf1[200];
char buf2[200];
scanf("%s",buf1);
scanf("%s",buf2);
string str1=buf1;
string str2=buf2;
// 1.合并
string arr;
for(int i=0;i<str1.size();i++)
{
arr.push_back(str1[i]);
}
for(int i=0;i<str2.size();i++)
{
arr.push_back(str2[i]);
}
// 2.分别得到奇数下标的数组和偶数下标的数组
char arr1[200];
char arr2[200];
int l1=0;
int l2=0;
for(int i=0;i<arr.size();i++)
{
if(i%2==0)
{
arr2[l2]=arr[i];
l2++;
}
else {
arr1[l1]=arr[i];
l1++;
}
}
// 3.分别排序
sort(arr1,arr1+l1,compare);
sort(arr2,arr2+l2,compare);
// 4.合并
char answer[400];
int t1=0;
int t2=0;
for(int i=0;i<l1+l2;i++)
{
if(i%2==0)
answer[i]=arr2[t2++];
else
answer[i]=arr1[t1++];
}
// 5.转换并输出
for(int i=0;i<l1+l2;i++)
{
/*
只对字符0~9、a~f、A~F进行转换,其他直接输出
*/
if(answer[i]>='0' && answer[i]<='9' || answer[i]>='a' && answer[i]<='f' || answer[i]>='A' && answer[i]<='F')
{
printf("%c",transf(answer[i]));
}
else
{
printf("%c",answer[i]);
}
}
}