Skip to content

HJ30 字符串合并处理 ​

本节目标:理解“HJ30 字符串合并处理”的核心思路,并能把它用于实际开发或面试表达。 较难 通过率:23.43% 时间限制:1秒 空间限制:32M 知识点==字符串====排序== 描述 按照指定规则对输入的字符串进行处理。 详细描述: 第一步:将输入的两个字符串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≤�≤100 1≤n≤100

输入描述: 样例输入两个字符串,用空格隔开。 输出描述: 输出转化后的结果。 示例1 输入: dec fab ==复制== 输出: 5D37BF ==复制== 示例2 输入: ab CD ==复制== 输出: 3B5D ==复制== 说明: 合并后为abCD,按奇数位和偶数位排序后是CDab(请注意要按ascii码进行排序,所以C在a前面,D在b前面),转换后为3B5D 示例3 输入: 123 15 ==复制== 输出: 88C4A

当然,这个表达式看起来相当复杂,因为它在一行中完成了多个转换步骤。这里是对c进行处理的步骤,假设c是一个十六进制字符(比如 'F'、'7'、'a'等)。我们将这个表达式分解成几个步骤:

  1. int(c, 16):将十六进制字符c转换为整数。
  • 例如,如果c = 'F',则转换结果为15。
  1. bin(...)[2:]:使用bin()函数将步骤1得到的整数转换成二进制表示的字符串,然后[2:]切片操作去除掉前缀'0b'。
  • 继续上面的例子,15转换为二进制是'0b1111',去除前缀后是'1111'。
  1. ...zfill(4):确保二进制字符串长度至少为4位,如果不够则在前面填充零。由于一个十六进制数字最多可以表示4位二进制数,这一步骤确保了转换的一致性。
  • 在这个例子中,'1111'已经是4位,所以这一步不会改变字符串。
  1. ...[::-1]:将上一步得到的字符串反转,实现二进制位的翻转。
  • '1111'反转后仍然是'1111'。如果考虑另一个字符,比如'E'转换后是'0111',反转为'1110'。
  1. int(..., 2):将翻转后的二进制字符串再次转换为整数。
  • '1111'转换回整数是15,'1110'转换为整数是14。
  1. hex(...)[2:]:使用hex()函数将步骤5的整数转换成十六进制表示的字符串,然后[2:]切片操作去除掉前缀'0x'。
  • 15转换为十六进制是'0xf',去除前缀后是'f'。14转换为十六进制是'0xe',去除前缀后是'e'。
  1. ...upper():将得到的十六进制字符串转换为大写。
  • 'f'变为'F','e'变为'E'。

整个表达式合起来就实现了将一个十六进制字符c转换为二进制,反转这个二进制表示,然后再将反转后的二进制表示转换回十六进制字符,并且转为大写的过程。

以'F'为例,整个过程是:

  1. 'F' -> 15
  2. 15 -> '1111'
  3. '1111' -> '1111'(长度已经是4位)
  4. '1111' -> '1111'(反转)
  5. '1111' -> 15
  6. 15 -> 'f'
  7. 'f' -> 'F'

这个过程对于不同的字符会有不同的转换结果,关键在于二进制翻转这一步。

这个函数用来把两个英文单词变成一个特别的密码 ​

def process_strings(str1, str2):

首先,我们把两个单词放在一起,像是最好的朋友一样 ​

merged_str = str1 + str2

然后,我们要给这些字母分组,一组是奇数位置的,一组是偶数位置的 ​

even_chars = sorted(merged_str[::2]) # 偶数位置的字母,比如在"apple"里,就是"a"和"l" odd_chars = sorted(merged_str[1::2]) # 奇数位置的字母,比如在"apple"里,就是"p"、"p"和"e"

接下来,我们按顺序把这些字母重新排列起来,保持它们原来是奇数位置还是偶数位置 ​

sorted_str = ''.join( even_chars[i//2] if i % 2 == 0 else odd_chars[i//2] for i in range(len(merged_str)))

现在,我们开始魔法转换,把一些特别的字母变成它们的秘密形式 ​

def convert_hex_char(c):

如果这个字母是0到9或者是a到f(无论大小写) ​

if c.isdigit() or (c.lower() >= 'a' and c.lower() <= 'f'):

我们先把它变成一个秘密数字,然后变成二进制,翻转过来,再变回秘密数字,最后大写 ​

return hex(int(bin(int(c, 16))[2:].zfill(4)[::-1], 2))[2:].upper()

如果这个字母没有什么特别,就保持原样 ​

return c

最后,我们用魔法把每个字母都变成它的秘密形式,并把它们连接起来,就完成了 ​

result = ''.join(convert_hex_char(c) for c in sorted_str) return result

我们从书本(控制台输入)里读取两个单词 ​

input_str = input().split()

使用我们的魔法(函数)处理这两个单词,并展示它们变成的密码 ​

print(process_strings(input_str[0], input_str[1]))

本站总访问 — 次