通过率 44% · 提交 530 · 通过 231
小慕正在处理一个字符串加密项目。他拿到一串未加密的字符串str,需要通过对每个字符进行偏移来加密。加密规则是:对于字符串中的第 i 个字符 str[i],偏移量为数组 a 中对应位置的元素 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。
这类题属于华为 OD 机考真题方向中「100分 / 字符串」方向的高频题型,通常考察对「100分 / 字符串」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为一个整数n (1 <= n <= 1000),表示有n组测试数据,每组数据包含一行,原文str(只含有小写字母,0 < 长度 <= 50)。
每组测试数据输出一行,表示字符串的密文
示例 1
输入示例
1 xy
输出示例
ya
第一个字符x偏移量是1,即为y,第二个字符y偏移量是2,即为a。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
第 i 个字符(i >= 3)的偏移量实际上符合 泰波那契数列,可以很容易地求出偏移量数组 OFFSETS。
由于题目要求输入 n 组用例,而每一次用的偏移量数组 OFFSETS 都是同一个,因此只需要 提前求一次偏移量数组 即可进行复用。
特别注意,对于 Java、C++ 等语言,泰波那契数列在取到 n = 50 时会出现 整型范围溢出 的问题,可以在构造 OFFSETS 数组的时候对 26 进行取模以避免该问题。
对于特定的字符 ch 的加密,需要用到 ord()、chr()、求模 等基础语法知识。
ord(ch) - ord("a") 可以计算得到字符 ch 和字母 "a" 之间的距离,加上偏移量 offset 并对 26 取模可以得到偏移后的字符和字母 "a" 之间的距离,加上 ord("a") 之后可以得到偏移后的字母的 ASCII 码值,最终再取 chr() 可以将 ASCII 码值转化为字母本身。
复杂度分析 设用例组数为 n,单个字符串的长度为 L(由代码注释可知本题串长上限为 50,偏移表按 50 预建)。
空间上,OFFSETS 数组固定为 O(50),每组用例的 StringBuilder 需要 O(L),总空间复杂度为 O(L)(不计输出本身)。另外,递推时对 26 取模不改变加密结果——偏移本来就是在模 26 意义下生效的——却把数值压在 int 范围内,既是防溢出的手段,也保证了偏移表可以安全复用。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有