题解 | #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))
滴滴公司福利 1726人发布