【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;
}
相关推荐
奶香臭豆腐4 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
晚夜微雨问海棠呀12 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
graceyun13 分钟前
C语言初阶习题【9】数9的个数
c语言·开发语言
hanbarger14 分钟前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye22 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋334 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行35 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园39 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
dundunmm1 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn