题解 | #HJ30 字符串合并处理#

字符串合并处理

https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f

方法1-巧用切片替换字符

通过列表切片直接将排序后的字符放置到正确的位置。

  1. int(x, base=16):将16进制转成十进制
  2. bin(...)[2:].zfill(4)[::-1]:将十进制转成二进制,去除开头的'0b',前面补0至四位,然后再倒序。
  3. 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))

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务