加密的病历单

GitHub跳转原题关系图返回列表

按加密步骤的逆序恢复大小写、顺序和字母位置,解密病历字符串。

OJ: noi_openjudge

题目 ID: ch0107-12

难度:入门

标签:字符串模拟python

日期: 2026-07-30 23:01

题意

密文由“字母左移三位、整体逆序、大小写互换”得到,要求恢复原文。

思路

解密必须反向执行:先 swapcase(),再切片 [::-1] 逆序,最后对每个字母循环右移三位。循环位移通过把字母映射到 002525 后取模实现。

代码

Python代码

python
def shift_right_three(character: str) -> str:
    start = ord("a") if character.islower() else ord("A")
    return chr((ord(character) - start + 3) % 26 + start)


ciphertext = input().strip()
# 解密按加密操作的逆序进行:反转大小写、恢复顺序、字母右移三位。
recovered_order = ciphertext.swapcase()[::-1]
print("".join(shift_right_three(character) for character in recovered_order))

C++代码

cpp
#include <cstdio>
#include <cstring>

char str[100];

char _map1[] = "defghijklmnopqrstuvwxyzabc";
char _map2[] = "DEFGHIJKLMNOPQRSTUVWXYZABC";

int main(){
    int i,len;
    scanf("%s",str+1);
    len = strlen(str+1);

    //反过来
    int mid = len /2;
    for(i=1;i<=mid;i++){
        char t = str[i];
        str[i] = str[len+1-i];
        str[len+1-i]=  t;
    }
    // 大小写反转
    for (i=1;i<=len;i++){
        if( str[i] >='a' && str[i] <='z'){
            str[i] += 'A'-'a';
        }
        else {
            str[i] += 'a'-'A';
        }
    }
    /* 输出 */
    for (i=1;i<=len;i++){
        if( str[i] >='a' && str[i] <='z'){
            printf("%c",_map1[ str[i] - 'a']);
        }
        else {
            printf("%c",_map2[ str[i] - 'A']);
        }
    }
    return 0;
}

复杂度

时间复杂度和额外空间复杂度均为 O(n)O(n)

总结

复合变换的逆操作顺序必须完全倒过来。