字符串变换(HJ15)
字符串变换
题目描述
https://www.nowcoder.com/share/jump/5832603751775720361603
输入两个字符串 s1 和 s2: - s1:字母进行大小写转换并后移 1 位,数字后移 1 位 - s2:字母进行大小写转换并前移 1 位,数字前移 1 位
字母移动范围在 26 个字母内循环,数字移动范围在 0-9 内循环。
示例
输入:
abc123
XYZ987BCD234
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 # 后移 1 位
3. 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 # 后移 1 位
3. 4 % 10 = 4 # 模 10 循环
4. 4 + ord('0') = 52 # 转回 ASCII
5. chr(52) = '4' # 最终结果以 ‘0’ 前移 1 位为例:
1. 0 - 1 = -1 # 前移 1 位
2. -1 % 10 = 9 # Python 模运算保证非负
3. 结果为 '9'时间复杂度
- O(n) - 遍历字符串一次
空间复杂度
- O(n) - 存储变换后的结果
字符串变换(HJ15)
https://mingsm17518.github.io/2026/04/09/algorithm/华为机考/nowcoder/String/15_string_transform/