【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;
}
相关推荐
像我这样帅的人丶你还1 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
小九九的爸爸1 小时前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学2 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
plainGeekDev3 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序8 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏9 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev10 小时前
ButterKnife → ViewBinding
android·java·kotlin
花酒锄作田19 小时前
Pydantic校验配置文件
python
hboot19 小时前
AI工程师第四课 - 深度学习入门
pytorch·python·神经网络
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端