按加密步骤的逆序恢复大小写、顺序和字母位置,解密病历字符串。
OJ: noi_openjudge
题目 ID: ch0107-12
难度:入门
标签:字符串模拟python
日期: 2026-07-30 23:01
题意
密文由“字母左移三位、整体逆序、大小写互换”得到,要求恢复原文。
思路
解密必须反向执行:先 swapcase(),再切片 [::-1] 逆序,最后对每个字母循环右移三位。循环位移通过把字母映射到
代码
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;
}复杂度
时间复杂度和额外空间复杂度均为
总结
复合变换的逆操作顺序必须完全倒过来。