🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1063
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~
🍓OJ题目截图
文章目录
- 📎在线评测链接
- 🍓OJ题目截图
- 🍏 密码解密
- 问题描述
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据范围
- 题解
- 参考代码
🍏 密码解密
问题描述
LYA 收到了一段加密后的字符串 s s s,这段字符串是通过一个特殊的 “密码本” 加密的。“密码本” 的映射规则如下:字母 ′ a ′ 'a' ′a′ 到 ′ i ′ 'i' ′i′ 分别用数字 ′ 1 ′ '1' ′1′ 到 ′ 9 ′ '9' ′9′ 表示;字母 ′ j ′ 'j' ′j′ 到 ′ z ′ 'z' ′z′ 分别用 ′ 10 ∗ ′ '10*' ′10∗′ 到 ′ 26 ∗ ′ '26*' ′26∗′ 表示。现在 LYA 需要你的帮助,将这段 “密文” 解密并输出明文。
注意:映射规则保证是唯一的,即每个字母只会被映射到唯一的数字或数字+星号的组合。
输入格式
输入一行,包含一个字符串 s s s,表示 LYA 收到的 “密文”。
输出格式
输出一行,包含一个字符串,表示解密后的明文。
样例输入
20*19*20*
样例输出
tst
数据范围
- 解密后的明文长度不超过 100 100 100。
题解
本题可以通过 “密码本” 的映射规则,将 “密文” 中的数字或数字+星号的组合替换成对应的字母即可。
具体步骤如下:
-
从 26 26 26 到 1 1 1 遍历每个数字 i i i:
- 如果 i > 9 i>9 i>9,则将 i + " ∗ " i+"*" i+"∗" 替换成字符 ( c h a r ) ( ′ a ′ + i − 1 ) (char)('a'+i-1) (char)(′a′+i−1);
- 否则,将 i i i 替换成字符 ( c h a r ) ( ′ a ′ + i − 1 ) (char)('a'+i-1) (char)(′a′+i−1)。
-
输出替换后的字符串即为解密后的明文。
时间复杂度 O ( ∣ s ∣ ) O(|s|) O(∣s∣),空间复杂度 O ( ∣ s ∣ ) O(|s|) O(∣s∣)。其中 ∣ s ∣ |s| ∣s∣ 为字符串 s s s 的长度。
参考代码
- Python
s = input()
for i in range(26, 0, -1):
key = str(i) + ('*' if i > 9 else '')
val = chr(ord('a') + i - 1)
s = s.replace(key, val)
print(s)
- Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
for (int i = 26; i >= 1; i--) {
String key = i + (i > 9 ? "*" : "");
char val = (char) ('a' + i - 1);
s = s.replace(key, String.valueOf(val));
}
System.out.println(s);
}
}
- Cpp
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
for (int i = 26; i >= 1; i--) {
string key = to_string(i) + (i > 9 ? "*" : "");
char val = 'a' + i - 1;
for (int j = 0; j < s.length(); j++) {
if (s.substr(j, key.length()) == key) {
s.replace(j, key.length(), 1, val);
}
}
}
cout << s << endl;
return 0;
}