【华为OD-E卷 - 字符串加密 100分(python、java、c++、js、c)】
题目
给你一串未加密的字符串str,通过对字符串的每一个字母进行改变来实现加密,加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量,数组a前三位已经赋值:a[0]=1,a[1]=2,a[2]=4。
当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。
例如:原文 abcde 加密后 bdgkr,其中偏移量分别是1,2,4,7,13
输入描述
- 第一行为一个整数n(1<=n<=1000),表示有n组测试数据,每组数据包含一行,原文str(只含有小写字母,0<长度<=50)
输出描述
- 每组测试数据输出一行,表示字符串的密文
用例
用例一:
输入:
1
xy
输出:
ya
python解法
- 解题思路:
- 这段代码实现了一种加密算法。通过以下步骤完成:
生成位移序列:
使用 generate_shift 函数递归生成一个位移值序列。前 3 个位移值是固定的 [1, 2, 4],之后的位移值是基于前三个值的和计算的,并对 26 取模,形成循环。
使用 memo 记忆化存储已计算的位移值,避免重复计算。
加密文本:
对输入文本的每个字符,根据其在字符串中的索引生成对应的位移值。
字符的 ASCII 值经过位移处理后重新转换为字符,实现加密操作。
多文本处理:
对多个输入文本分别执行加密操作,输出结果。
def generate_shift(index, memo):# 生成位移值的递归函数# 前三个值固定为 [1, 2, 4]if index < 3:return [1, 2, 4][index]# 如果位移值已经计算过,从 memo 中读取if index not in memo:# 使用递归计算当前位移值并存入 memo 中# 当前位移值等于前三个值之和模 26memo[index] = (generate_shift(index - 1, memo) + generate_shift(index - 2, memo) + generate_shift(index - 3, memo)) % 26return memo[index]def encrypt_text(s, memo):# 加密单个文本字符串result = []for i, char in enumerate(s):# 根据字符位置 i 生成对应的位移值shift = generate_shift(i, memo)# 计算加密后的字符# 字符转为 ASCII 值,进行位移操作后重新转为字符result.append(chr((ord(char) - 97 + shift) % 26 + 97))# 将加密后的字符列表合并为字符串return "".join(result)# 输入文本数量
n = int(input())
# 读取 n 个文本输入
texts = [input() for _ in range(n)]
# 初始化 memo 字典,存储位移值
memo = {}# 对每个输入文本加密并输出结果
for text in texts:print(encrypt_text(text, memo))
java解法
- 解题思路
更新中
C++解法
- 解题思路
- 这段代码实现了一个简单的加密算法。主要流程如下:
生成位移值:
使用 generate_shift 函数生成一个基于前3个固定值和递归公式计算的位移值序列。
使用 unordered_map 进行记忆化,避免重复计算。
加密文本:
遍历输入字符串的每个字符,根据字符的索引生成对应的位移值。
使用位移值对字符进行偏移,并保持加密后的字符在 ‘a’ 到 ‘z’ 的范围内。
多文本处理:
接收多行输入文本,逐行进行加密并输出结果
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>using namespace std;// 递归生成位移值
int generate_shift(int index, unordered_map<int, int>& memo) {// 前三个固定位移值为 [1, 2, 4]if (index < 3) {return vector<int>{1, 2, 4}[index];}// 如果位移值尚未计算,进行递归计算并存储到 memoif (memo.find(index) == memo.end()) {// 当前位移值为前三个位移值之和模 26memo[index] = (generate_shift(index - 1, memo) + generate_shift(index - 2, memo) + generate_shift(index - 3, memo)) % 26;}return memo[index];
}// 对单个字符串进行加密
string encrypt_text(const string& s, unordered_map<int, int>& memo) {string result; // 存储加密后的字符串for (int i = 0; i < s.size(); ++i) {// 根据字符索引 i 生成位移值int shift = generate_shift(i, memo);// 对字符进行加密操作并保持在 'a'-'z' 范围内result += char((s[i] - 'a' + shift) % 26 + 'a');}return result;
}int main() {int n; // 输入文本的数量cin >> n; // 读取文本数量cin.ignore(); // 忽略换行符以便读取多行输入vector<string> texts(n); // 存储输入的文本for (int i = 0; i < n; ++i) {getline(cin, texts[i]); // 逐行读取文本}unordered_map<int, int> memo; // 用于存储位移值的记忆化表for (const string& text : texts) {// 对每个文本加密并输出结果cout << encrypt_text(text, memo) << endl;}return 0;
}
C解法
更新中
JS解法
更新中
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏