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

字符串合并处理

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

s = input()

s_list = s.split()

# 1.将输入的两个字符串str1和str2进行前后合并
str3 = ''  # 合并字符串
for i in s_list:
    str3 += i

# 2.对合并后的字符串进行排序
#     - 下标为奇数的字符和下标为偶数的字符分别从小到大排序(下标:字符串中的位置,从0开始)
#     - 再依次分别放回原串中的偶数位和奇数位

list_0 = []  # 存偶数位
list_1 = []  # 存奇数位

for i in range(len(str3)):  # 遍历字符串,分别存储奇、偶数位置的字符
    if i % 2 == 0:
        list_0.append(str3[i])
    else:
        list_1.append(str3[i])

l_0 = sorted(list_0)  # 对偶数位置部分排序
l_1 = sorted(list_1)  # 对奇数位置部分排序

n, m = 0, 0  # n, m 分别指向偶数、奇数需要插入的下一个元素位置
str4 = ''  # 存储合并的排序后字符串
for i in range(len(str3)):
    if i % 2 == 0:
        str4 += l_0[n]
        n += 1
    else:
        str4 += l_1[m]
        m += 1

# 转换操作:对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符
ans = ''
for i in str4:
    if i.isalpha():  # 对于字母
        if 'a' <= i <= 'f' or 'A' <= i <= 'F':  # a-f, A-F这些字母
            n = int(i, 16)  # 转换成16进制对应的十进制整数
            n_s = str(bin(n))[2::].zfill(4)[::-1]  # 转换成二进制,再转换成字符串,最后切片去除二进制前缀0b以及逆序
            '''
            上面一行代码:
                1. 利用bin()函数转换成二进制,再通过str()函数转换成字符串
                2. 利用切片[2::]去掉二进制前面的0b
                3. 利用zfill()函数在前面补0到4位二进制数
                4. 利用切片[::-1]使该二进制字符串逆序
            '''
            m = str(hex(int(n_s, 2)))[:1:-1]            
            ans += m.upper()  # 将字母改为大写形式
        else:  # 其他字母
            ans += i
    else:  # 对于数字
        n = int(i, 16)
        n_s = str(bin(n))[2::].zfill(4)[::-1]
        m = str(hex(int(n_s, 2)))[:1:-1]
        ans += m.upper()

print(ans)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务