将所有数字用字符替换

标签: 字符串

难度: Easy

给你一个下标从 0 开始的字符串 s ,它的 偶数 下标处为小写英文字母,奇数 下标处为数字。

定义一个函数 shift(c, x) ,其中 c 是一个字符且 x 是一个数字,函数返回字母表中 c 后面第 x 个字符。

  • 比方说,shift('a', 5) = 'f' 和 shift('x', 0) = 'x' 。

对于每个 奇数 下标 i ,你需要将数字 s[i] 用 shift(s[i-1], s[i]) 替换。

请你替换所有数字以后,将字符串 s 返回。题目 保证 shift(s[i-1], s[i]) 不会超过 'z' 。

 

示例 1:

输入:s = "a1c1e1"
输出:"abcdef"
解释:数字被替换结果如下:
- s[1] -> shift('a',1) = 'b'
- s[3] -> shift('c',1) = 'd'
- s[5] -> shift('e',1) = 'f'

示例 2:

输入:s = "a1b2c3d4e"
输出:"abbdcfdhe"
解释:数字被替换结果如下:
- s[1] -> shift('a',1) = 'b'
- s[3] -> shift('b',2) = 'd'
- s[5] -> shift('c',3) = 'f'
- s[7] -> shift('d',4) = 'h'

 

提示:

  • 1 <= s.length <= 100
  • s 只包含小写英文字母和数字。
  • 对所有 奇数 下标处的 i ,满足 shift(s[i-1], s[i]) <= 'z' 。

Submission

运行时间: 24 ms

内存: 0.0 MB

class Solution:
    def replaceDigits(self, s: str) -> str:
        temp = ""
        for i in range(len(s)):
            if ord(s[i]) <97 :
                temp +=chr(ord(s[i-1]) + int(s[i]))
            else:
                temp += s[i]
        return temp
            

Explain

此题解通过遍历字符串s的每个字符,根据字符的ASCII码来判断当前字符是字母还是数字。如果是字母(ASCII码大于等于97),则直接添加到结果字符串中;如果是数字(ASCII码小于97),则将其转换为整数,并与前一个字符(必定是字母)的ASCII码相加,使用chr函数将结果转换回字符后添加到结果字符串中。这种方法直接在遍历过程中构建了最终的字符串,避免了额外的替换操作。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def replaceDigits(self, s: str) -> str:
        temp = ""
        for i in range(len(s)):
            if ord(s[i]) < 97: # 判断当前字符是否是数字
                temp += chr(ord(s[i - 1]) + int(s[i])) # 使用前一个字母字符进行shift操作
            else:
                temp += s[i] # 如果是字母则直接添加到结果中
        return temp

Explore

在该算法中,实际上没有直接的检查来确保`chr(ord(s[i - 1]) + int(s[i]))`的结果不会超过'z'。如果要确保不超过'z',可以在转换前添加一个条件检查。例如,可以使用`min`函数来确保不超过'z'的ASCII码:`chr(min(ord(s[i - 1]) + int(s[i]), ord('z')))。这样即使数字加上前一个字符的ASCII码超过了'z',输出也会被限制在'z'。

当前题解的算法设计假设字符串s中每个数字字符都只有一位,因此不支持处理两位数或更大的数字。如果遇到两位数或更大的数字,则需要修改算法以支持解析完整的数字字符串。这可以通过检查连续的数字字符并将它们转换成一个完整的数字来实现。然而,基于题解现有的代码结构和逻辑,这种情况并不适用,需要更多的上下文或对问题描述的重新定义。

使用`ord(s[i]) < 97`来判断字符是否为数字是一种基于ASCII值的判断方法。这种方法假设输入的字符要么是小写字母(ASCII码97到122),要么是数字(ASCII码在48到57之间)。尽管这种方法有效,但使用`s[i].isdigit()`会更清晰和直观,因为它直接表明代码的意图是检查字符是否为数字,并且不依赖于特定的ASCII码范围。使用`isdigit()`提高了代码的可读性和可维护性。