vs平台做网站公司网站定制
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++
题目描述
给定一段 “密文”字符串 s
,其中字符都是经过 “密码本” 映射的,现需要将“密文”解密并且输出。
映射的规则:
- (
a
−i
) 分别用(1
−9
)表示; - (
j
−z
) 分别用(10∗
−26∗
)表示。
约束:映射始终唯一。
输入描述
“密文”字符串
输出描述
明文字符串
示例1
输入:
20*19*20*输出:
tst说明:
翻译后的文本长度在 100 以内。
题解
基本思路是从密文字符串的末尾开始遍历,根据规则进行解密,并最终输出解密后的明文字符串。
关键点:
- 对于包含 ‘*’ 的情况,解析前两个字符,进行相应的解密操作。
- 对于不包含 ‘*’ 的情况,进行简单的解密操作。
- 在遍历过程中,逐步构建解密后的密码。
- 最后,反转密码字符串,因为是从末尾开始遍历的。
Java
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 读取输入文本String text = in.next();// 存储解密后的密码StringBuilder pwd = new StringBuilder();for (int i = text.length() - 1; i >= 0; ) {if (text.charAt(i) == '*') {char c = (char) (Integer.parseInt(text.substring(i - 2, i)) - 10 + 'j');pwd.append(c);i -= 3;} else {char c = (char) (text.charAt(i) - '1' + 'a');pwd.append(c);i -= 1;}}// 输出解密后的密码System.out.println(pwd.reverse().toString());}
}
Python
# 读取输入文本
text = input()# 存储解密后的密码
pwd = []# 从字符串末尾开始遍历
i = len(text) - 1
while i >= 0:if text[i] == '*':# 如果当前字符是 '*',则解析前两个字符并进行解密num = int(text[i - 2:i])c = chr(num - 10 + ord('j'))pwd.append(c)i -= 3else:# 如果当前字符不是 '*',则进行简单解密c = chr(ord(text[i]) - ord('1') + ord('a'))pwd.append(c)i -= 1# 输出解密后的密码
print(''.join(pwd[::-1]))
C++
#include <bits/stdc++.h>
using namespace std;int main(){string text;cin >> text;string pwd;int n = text.length();for(int i = n - 1; i >= 0; ){// 遇到 * 肯定解密 j - zif(text[i] == '*'){char c = stoi(text.substr(i - 2, 2)) - 10 + 'j';pwd.push_back(c);i -= 3;}else{ // 否则 a - ichar c = text[i] - '1' + 'a';pwd.push_back(c);i -= 1;}}reverse(pwd.begin(), pwd.end());cout << pwd << endl;return 0;
}
相关练习题
题号 | 题目 | 难易 |
---|---|---|
LeetCode 2325 | 2325. 解密消息 | 简答 |
❤️华为OD机试面试交流群(每日真题分享): 加V时备注“华为od加群”
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏