Skip to content

HJ36 字符串加密 ​

本节目标:理解“HJ36 字符串加密”的核心思路,并能把它用于实际开发或面试表达。 中等 通过率:41.27% 时间限制:1秒 空间限制:32M 知识点==字符串== 描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示) 上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。 请实现下述接口,通过指定的密匙和明文得到密文。 数据范围:1≤�≤100 1≤n≤100 ,保证输入的字符串中仅包含小写字母 输入描述: 先输入key和要加密的字符串 输出描述: 返回加密后的字符串 示例1 输入: nihaoni ==复制== 输出: le

你说得对,每次通过 alphabet.index(char) 查找字符索引确实会导致效率较低,特别是当处理较长的字符串时。为了提高效率,我们可以预先计算并存储正常字母表与新字母表之间的映射关系。这样,我们就可以直接通过查找操作来获取加密后的字符,而无需在每次迭代中遍历整个字母表。

下面是改进后的代码: def encrypt(key, message):

创建一个正常的小写字母表 ​

alphabet = 'abcdefghijklmnopqrstuvwxyz'

初始化一个空字典用于存储字母表映射 ​

letter_mapping = {}

首先,处理密钥,移除重复字母,构建新字母表的前半部分 ​

new_alphabet = [] for char in key: if char not in new_alphabet: new_alphabet.append(char)

将未在密钥中出现的字母按正常顺序添加到新字母表的后半部分 ​

for char in alphabet: if char not in new_alphabet: new_alphabet.append(char)

建立正常字母表到新字母表的映射关系 ​

for original, new in zip(alphabet, new_alphabet): letter_mapping[original] = new letter_mapping[original.upper()] = new.upper() # 同时处理大写字母

使用映射关系加密信息 ​

encrypted_message = "".join(letter_mapping.get(char, char) for char in message) return encrypted_message

输入处理 ​

key = input().strip() # 密钥 message = input().strip() # 要加密的信息

加密并打印结果 ​

print(encrypt(key, message))

在这个改进版本中,letter_mapping 字典存储了从原始字母表到加密字母表的映射关系,包括小写和大写字母。通过 zip(alphabet, new_alphabet) 我们能够创建这个映射,这样 letter_mapping.get(char, char) 就可以直接获取加密后的字符,如果字符不在映射表中(即,它不是字母),则默认返回字符本身。这种方式避免了在加密过程中反复遍历字母表,从而提高了效率。

本站总访问 — 次