字符串变换(HJ15)

字符串变换

题目描述

https://www.nowcoder.com/share/jump/5832603751775720361603

输入两个字符串 s1 和 s2: - s1:字母进行大小写转换并后移 1 位,数字后移 1 位 - s2:字母进行大小写转换并前移 1 位,数字前移 1 位

字母移动范围在 26 个字母内循环,数字移动范围在 0-9 内循环。

示例

输入:

abc123
XYZ987
输出:
BCD234
wyz876

解题思路

统一变换函数

通过 flag 参数控制变换方向: - flag = 1:后移(+1) - flag = -1:前移(-1)

变换规则: 1. 小写字母 → 大写字母 + 移位 2. 大写字母 → 小写字母 + 移位 3. 数字 → 数字 + 移位

使用模运算实现循环移动。

代码实现

s1 = input().strip()
s2 = input().strip()

def fun(s, flag):
    res = []
    for ch in s:
        cur = ord(ch)
        if ch.isalpha():
            if ch.islower():
                base = ord('a')
                new = ord('A')
            else:
                base = ord('A')
                new = ord('a')
            cur = (cur - base + flag) % 26 + new

        else:
            cur = (cur - ord('0') + flag) % 10 + ord('0')
        res.append(chr(cur))
    print(''.join(res))

fun(s1, 1)
fun(s2, -1)

代码解析

字母变换逻辑

if ch.islower():
    base = ord('a')  # 97
    new = ord('A')   # 65
else:
    base = ord('A')  # 65
    new = ord('a')   # 97

cur = (cur - base + flag) % 26 + new

以 ‘c’ 后移 1 位为例

1. ord('c') - ord('a') = 2      # 归一化到 0-25
2. 2 + 1 = 3                     # 后移 13. 3 % 26 = 3                    # 模 26 循环
4. 3 + ord('A') = 68             # 转回 ASCII
5. chr(68) = 'D'                 # 最终结果

数字变换逻辑

cur = (cur - ord('0') + flag) % 10 + ord('0')

以 ‘3’ 后移 1 位为例

1. ord('3') - ord('0') = 3       # 归一化到 0-9
2. 3 + 1 = 4                     # 后移 13. 4 % 10 = 4                    # 模 10 循环
4. 4 + ord('0') = 52             # 转回 ASCII
5. chr(52) = '4'                 # 最终结果

以 ‘0’ 前移 1 位为例

1. 0 - 1 = -1                    # 前移 12. -1 % 10 = 9                   # Python 模运算保证非负
3. 结果为 '9'

时间复杂度

  • O(n) - 遍历字符串一次

空间复杂度

  • O(n) - 存储变换后的结果

字符串变换(HJ15)
https://mingsm17518.github.io/2026/04/09/algorithm/华为机考/nowcoder/String/15_string_transform/
作者
Ming
发布于
2026年4月9日
更新于
2026年4月9日
许可协议