返回目录

题目描述

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

映射的规则(‘a’ \~ ‘i’)分别用(‘1’ \~ ‘9’)表示;(‘j’ \~ ‘z’)分别用(“10*” \~ “26*”)表示。

约束:映射始终唯一。

输入描述

“密文”字符串

输出描述

明文字符串

备注:翻译后的文本长度在100以内

示例:

输入20*19*20*
输出tst
说明

解题思路

暴力替换,需要注释的是先从"10*" \~ "26*开始映射替换

Python算法源码

# 从用户输入接收密文字符串
s = input()

# 创建一个映射字典,用于将'10*'到'26*'映射到'j'到'z'
# 对于10到26之间的每个数字i,键是字符串形式的i加上'*';
# 对应的值是通过ASCII码转换得到的字母(ASCII码97是'a',所以96+i就是对应的字母)
mapping = {str(i) + '*': chr(96 + i) for i in range(10, 27)}

# 更新映射字典,将'1'到'9'映射到'a'到'i'
for i in range(1, 10):
    # 将数字转换成字符串作为键,将ASCII码转换得到的字母作为值
    mapping[str(i)] = chr(96 + i)

# 遍历映射字典中的每一对键值对
for key, value in mapping.items():
    # 使用字符串的replace方法,将密文中的每个加密字符(键)替换为对应的字母(值)
    s = s.replace(key, value)

# 打印解密后的明文字符串
print(s)

C算法源码

#include <stdio.h>
#include <string.h>

int main() {
    char s[1000];
    printf("Enter the ciphertext: ");
    fgets(s, sizeof(s), stdin); // 从标准输入接收密文字符串

    // 遍历映射并进行替换
    for (int i = 26; i >= 1; i--) {
        // 构造映射的键:对于10到26,添加'*';否则使用数字本身
        char key[4]; // 考虑到多一位 '*'
        sprintf(key, "%d%s", i, (i >= 10) ? "*" : "");

        // 构造映射的值:ASCII码97对应'a',因此96+i对应的字符
        char value = 96 + i;

        // 使用字符串的替换方法,将密文中的每个加密字符(键)替换为对应的字母(值)
        char *pos = strstr(s, key);
        while (pos != NULL) {
            pos[0] = value; // 替换为对应字母
            memmove(pos + 1, pos + strlen(key), strlen(pos + strlen(key)) + 1); // 删除多余字符
            pos = strstr(pos + 1, key); // 继续查找下一个匹配位置
        }
    }

    // 打印解密后的明文字符串
    printf("Decrypted text: %s", s);
    return 0;
}

Java算法源码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the ciphertext: ");
        String s = scanner.nextLine(); // 从标准输入接收密文字符串

        // 遍历映射并进行替换
        for (int i = 26; i >= 1; i--) {
            // 构造映射的键:对于10到26,添加'*';否则使用数字本身
            String key = Integer.toString(i) + (i >= 10 ? "*" : "");

            // 构造映射的值:ASCII码97对应'a',因此96+i对应的字符
            char value = (char) (96 + i);

            // 使用字符串的replace方法,将密文中的每个加密字符(键)替换为对应的字母(值)
            s = s.replace(key, Character.toString(value));
        }

        // 打印解密后的明文字符串
        System.out.println("Decrypted text: " + s);

        // 关闭扫描器
        scanner.close();
    }
}
最后修改:2024 年 04 月 02 日
如果觉得我的文章对你有用,请随意赞赏