通过率 56% · 提交 902 · 通过 509
小慕在整理一份加密的项目文档,其中包含一段“”字符串s,每个字符都经过“密码本”。现在小慕需要将这段“密文”解密,并输出映射规则("a-i"分别用"1-9"表示,"j-z"分别用""表示)。 约束:映射始终唯一。
这类题属于华为 OD 机考真题方向中「100分 / 2024D」方向的高频题型,通常考察对「100分 / 2024D」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
“密文”字符串
明文字符串
示例 1
输入示例
20*19*20*
输出示例
tst
示例 2
输入示例
12320*12319*20*
输出示例
abctabcst
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题需要分两步走:对原字符串的预处理以及元素映射关系。
涉及元素一一映射的关系,构建从数字到字母的映射这件事,很容易想到应该使用哈希表来解决。
为了构建数字和字母之间的映射,可以使用ASCII码值来完成。使用 ord("a") 可以计算得到字符 "a" 的 ASCII 码值,选定数字 i 的范围为 [1, 26],则 ord("a") + i - 1 可以得到所有小写字母的 ASCII 码值,再使用 chr() 内置函数将 ASCII 码值转换回小写字母,即 chr(ord("a") + i - 1)。故构建映射关系哈希表的代码为:
另外,本题所给密码字符串中,**两位数(10-26)的后面都会带一个 *,而一位数(1-9)的后面不带 ***,我们必须把这两种情况区分开来。
如果我们从头到尾地遍历原字符串 s,每次遇到一个 * 号,则说明此时 * 号前面的两个字符需要合并在一起,视为一个两位数来处理。
很显然,只有在遇到 * 号的时候,才需要去查看刚刚最新遇到的两个数字字符,这是一种后进先出的思路,很显然可以使用栈来处理这个过程。其过程如下:
退出循环后,栈中储存了若干个数字字符串(有一位数也有两位数),再将这些数字字符串传入哈希表中进行从数字到字母的映射,再合并为一个字符串输出即为答案。代码如下:
复杂度分析 设密文字符串 s 的长度为 n。构建 1 到 26 与字母的映射表是固定的 26 次操作,O(1)。主循环对 s 做单次遍历:普通数字字符直接入栈是 O(1);遇到 "*" 弹出两个元素、合并后压回,也是 O(1)。扫描共 O(n)。最后把栈里的数字串逐个查表并 join 成结果,O(n)。总时间复杂度 O(n),空间复杂度 O(n)(栈中最多存 n 个字符片段)。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有