密码解密 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

给定一段 “密文”字符串 s ,其中字符都是经过 “密码本” 映射的,现需要将“密文”解密并且输出。

映射的规则:

  • ( ai ) 分别用(19 )表示;
  • (jz ) 分别用(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 -= 3
    else:
        # 如果当前字符不是 '*',则进行简单解密
        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 - z
        if(text[i] == '*'){
            char c = stoi(text.substr(i - 2, 2)) - 10 + 'j';
            pwd.push_back(c);
            i -= 3;
        }else{ // 否则 a - i
            char c = text[i] - '1' + 'a';
            pwd.push_back(c);
            i -= 1;
        }
    }

    reverse(pwd.begin(), pwd.end());

    cout << pwd << endl;

    return 0;
}

相关练习题

alt

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##春招##校招##秋招##华为#
全部评论

相关推荐

06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务