【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 密码解密(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1063

🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~

🍓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。

题解

本题可以通过 "密码本" 的映射规则,将 "密文" 中的数字或数字+星号的组合替换成对应的字母即可。

具体步骤如下:

  1. 从 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)。
  2. 输出替换后的字符串即为解密后的明文。

时间复杂度 O ( ∣ s ∣ ) O(|s|) O(∣s∣),空间复杂度 O ( ∣ s ∣ ) O(|s|) O(∣s∣)。其中 ∣ s ∣ |s| ∣s∣ 为字符串 s s s 的长度。

参考代码

  • Python
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
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
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;
}
相关推荐
歪歪1001 天前
qt creator新手入门以及结合sql server数据库开发
c语言·开发语言·后端·qt·数据库开发
@大迁世界1 天前
用 popover=“hint“ 打造友好的 HTML 提示:一招让界面更“懂人”
开发语言·前端·javascript·css·html
用户3721574261351 天前
Python 实现 HTML 转 Word 和 PDF
java
a587691 天前
Java核心概念精讲:TCP与UDP的区别、Java NIO的几个核心组件与HTTP和HTTPS的区别等(46-50)
java·面试·nio
中等生1 天前
Pandas 与 NumPy:数据分析中的黄金搭档
后端·python
渣哥1 天前
ConcurrentHashMap 的 get 要不要加锁?一次“多此一举”的心路历程
java
用户8356290780511 天前
Python查找替换PDF文字:告别手动,拥抱自动化
后端·python
星哥说事1 天前
Python自学12 — 函数和模块
开发语言·python
愿你天黑有灯下雨有伞1 天前
一种基于注解与AOP的Spring Boot接口限流防刷方案
java·spring boot·后端
MuMuMu#1 天前
JAVA NIO学习笔记基础强化学习总结
java·学习·nio