牛客网学习笔记(HJ29 字符串加解密)

225 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为中等题HJ29 字符串加解密

HJ29 字符串加解密

描述

对输入的字符串进行加解密,并输出。

加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。

解密方法为加密的逆过程。

数据范围:输入的两个字符串长度满足 1≤n≤1000 ,保证输入的字符串都是只由大小写字母或者数字组成

输入描述:

第一行输入一串要加密的密码 第二行输入一串加过密的密码

输出描述:

第一行输出加密后的字符 第二行输出解密后的字符

示例1

输入:

abcdefg
BCDEFGH

输出:

BCDEFGH
abcdefg

代码

我写的

def zip(s):
    re = ''
    for i in range(len(s)):
        if 'a'<= s[i] < 'z':
            re += chr(ord(s[i]) + ord('B') - ord('a'))
        elif s[i] == 'z':
            re += 'A'
        elif 'A'<= s[i] < 'Z':
            re += chr(ord(s[i]) + ord('b') - ord('A'))
        elif s[i] == 'Z':
            re += 'a'
        elif '0' <= s[i] < '9':
            re += str(int(s[i])+1)
        elif s[i] == '9':
            re += '0'
    return re
def unzip(s):
    re = ''
    for i in range(len(s)):
        if 'a'< s[i] <= 'z':
            re += chr(ord(s[i]) + ord('A') - ord('b'))
        elif s[i] == 'a':
            re += 'Z'
        elif 'A'< s[i] <= 'Z':
            re += chr(ord(s[i]) + ord('a') - ord('B'))
        elif s[i] == 'A':
            re += 'z'
        elif '0' < s[i] <= '9':
            re += str(int(s[i])-1)
        elif s[i] == '0':
            re += '9'
        else:
            re += s[i]
    return re
s1 = input()
s2 = input()
print(zip(s1))
print(unzip(s2))

其他人写的

def check(a,b):
    L1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    L2 = "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890"
    result = ""
    if b == 1:
        for i in a:
            result += L2[L1.index(i)]
    elif b == -1:
        for i in a:
            result += L1[L2.index(i)]
    return result
while True:
    try:
        print(check(input(),1))
        print(check(input(), -1))
 
    except:
        break

解析

我的写法是完全按照要求进行变换,用if对不同的情况进行相应的变换,优点是不用动脑子想,缺点是很繁琐而且容易出错、写的还慢。
看别人写的感觉很棒啊!用两个字符串来做映射,完美解决了分类对应的问题,简单方便!