题解 | #HJ30 字符串合并处理#
字符串合并处理
https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
方法1-巧用切片替换字符
通过列表切片直接将排序后的字符放置到正确的位置。
- int(x, base=16):将16进制转成十进制
- bin(...)[2:].zfill(4)[::-1]:将十进制转成二进制,去除开头的'0b',前面补0至四位,然后再倒序。
- hex(..., base=2)[2:].upper():将二进制转成16进制,去除开头的'0x',最后再转成大写。
# 预先计算十六进制字符的转换表 hex_chars = '0123456789ABCDEFabcdef' hex_map = {x: hex(int(bin(int(x, 16))[2:].zfill(4)[::-1], 2))[2:].upper() for x in hex_chars} # 定义字符转换函数 def encrypt(x): return hex_map.get(x, x) while True: try: a = list(input().replace(' ', '')) # 去除空格后转成列表 a[::2] = sorted(a[::2]) # 偶数位置从小到大排序 a[1::2] = sorted(a[1::2]) # 奇数位置从小到大排序 res = ''.join(encrypt(i) for i in a) # 使用join和转换函数构建结果字符串 print(res) except: break
方法2-交替添加排序后的奇偶数索引的字符
def convert(s1, s2): # 合并输入的两个字符串 s = s1 + s2 # 分别存储偶数索引和奇数索引的字符 even_chars = [c for i, c in enumerate(s) if i % 2 == 0] odd_chars = [c for i, c in enumerate(s) if i % 2 != 0] # 对偶数索引和奇数索引的字符列表进行排序 even_chars_sorted = sorted(even_chars) odd_chars_sorted = sorted(odd_chars) # 存放排序后的字符 sorted_chars = [] even_idx, odd_idx = 0, 0 # 交替添加排序后的偶数索引字符和奇数索引字符 for i in range(len(s)): if i % 2 == 0: # 添加偶数索引的字符 sorted_chars.append(even_chars_sorted[even_idx]) even_idx += 1 else: # 添加奇数索引的字符 sorted_chars.append(odd_chars_sorted[odd_idx]) odd_idx += 1 # 定义十六进制字符集 hex_chars = '0123456789ABCDEFabcdef' # 遍历字符列表进行转换 for i, c in enumerate(sorted_chars): if c in hex_chars: # 将十六进制字符转换为二进制,填充至4位,反转,再转换回十进制,最后转换回十六进制大写 sorted_chars[i] = hex(int(bin(int(c, 16))[2:].zfill(4)[::-1], 2))[2:].upper() # 返回最终转换后的字符串 return ''.join(sorted_chars) s1, s2 = input().split() print(convert(s1, s2))