描述
按照指定规则对输入的字符串进行处理。
详细描述
第一步:将输入的两个字符串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 \le n \le 100 \1≤n≤100
输入描述
样例输入两个字符串,用空格隔开。
输出描述
输出转化后的结果。
代码解析
# 合并
# 下标奇数和下标偶数分别排序
# 十六进制转二进制,二进制倒序后转十六进制
str1 = input().split()
str2 = str1[0] + str1[1]
str2 = [i for i in str2] # 转成单个字符列表
list1 = [] # 存奇数索引的数
list2 = [] # 存偶数索引的数
for index, i in enumerate(str2):
if index % 2 == 0:
list2.append(i)
else:
list1.append(i)
list1 = sorted(list1, reverse=False)
list2 = sorted(list2, reverse=False)
count_1 = 0 # 偶数位索引
count_2 = 0 # 奇数位索引
for index, i in enumerate(str2):
if index % 2 == 0:
str2[index] = list2[count_1]
count_1 += 1
if index % 2 == 1:
str2[index] = list1[count_2]
count_2 += 1
str2 = "".join(str2)
# print(str2)
str2 = [i for i in str2]
new_str2 = []
for i in str2:
# 如果是字母,并且不是十六进制的字母,保持原样,否则,按照规则进行转换
if i.upper() not in ["A", "B", "C", "D", "E", "F"] and i.isalpha():
new_str2.append(i)
else:
tep = (bin(int(i, 16))[2:]) # 先转成10进制,再转成2进制
# 这题要补0
if len(tep) == 3:
tep = "0" + tep
if len(tep) == 2:
tep = "00" + tep
if len(tep) == 1:
tep = "000" + tep
new = hex(int(tep[::-1], 2))[2:]
if new.isalpha():
new = new.upper()
new_str2.append(new)
print("".join(new_str2))