字符串转化后的各位数字之和

标签: 字符串 模拟

难度: Easy

给你一个由小写字母组成的字符串 s ,以及一个整数 k

首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(也就是,'a'1 替换,'b'2 替换,... 'z'26 替换)。接着,将整数 转换 为其 各位数字之和 。共重复 转换 操作 k

例如,如果 s = "zbax"k = 2 ,那么执行下述步骤后得到的结果是整数 8

  • 转化:"zbax" ➝ "(26)(2)(1)(24)" ➝ "262124" ➝ 262124
  • 转换 #1262124 ➝ 2 + 6 + 2 + 1 + 2 + 4 ➝ 17
  • 转换 #217 ➝ 1 + 7 ➝ 8

返回执行上述操作后得到的结果整数。

示例 1:

输入:s = "iiii", k = 1
输出:36
解释:操作如下:
- 转化:"iiii" ➝ "(9)(9)(9)(9)" ➝ "9999" ➝ 9999
- 转换 #1:9999 ➝ 9 + 9 + 9 + 9 ➝ 36
因此,结果整数为 36 。

示例 2:

输入:s = "leetcode", k = 2
输出:6
解释:操作如下:
- 转化:"leetcode" ➝ "(12)(5)(5)(20)(3)(15)(4)(5)" ➝ "12552031545" ➝ 12552031545
- 转换 #1:12552031545 ➝ 1 + 2 + 5 + 5 + 2 + 0 + 3 + 1 + 5 + 4 + 5 ➝ 33
- 转换 #2:33 ➝ 3 + 3 ➝ 6
因此,结果整数为 6 。

提示:

  • 1 <= s.length <= 100
  • 1 <= k <= 10
  • s 由小写英文字母组成

Submission

运行时间: 20 ms

内存: 16.1 MB

class Solution:
    def getLucky(self, s: str, k: int) -> int:
        s = ''.join(str(ord(c) - ord('a') + 1) for c in s)
        for _ in range(k):
            t = sum(int(c) for c in s)
            s = str(t)
        return int(s)

Explain

题解首先将字符串s中的每个字符转换成对应的字母表位置数字,然后将这些数字连续拼接成一个新的字符串。随后,对这个新字符串进行k次操作,每次操作将字符串中的所有数字相加得到一个新的数值,并更新字符串为这个数值。重复这个过程k次后,返回最终的数值。

时间复杂度: O(nk)

空间复杂度: O(n)

class Solution:
    def getLucky(self, s: str, k: int) -> int:
        # 将字符串s的每个字符转换为其在字母表中的位置
        s = ''.join(str(ord(c) - ord('a') + 1) for c in s)
        # 进行k次转换操作
        for _ in range(k):
            # 计算当前字符串s中所有字符的数字和
            t = sum(int(c) for c in s)
            # 将得到的和转换为字符串,准备下一轮操作
            s = str(t)
        # 最终返回转换后的整数
        return int(s)

Explore

在英文字母表中, `a` 是第一个字母,位置为1,`b` 是第二个,位置为2,依此类推。函数 `ord(c)` 返回字符 `c` 的ASCII数值。由于 `a` 的ASCII值是97, 当我们计算 `ord(c) - ord('a')` 时,实际上是在计算字符 `c` 相对于 `a` 的偏移量。例如,对于 `a`,`ord('a') - ord('a')` 结果为0,加1后就变成1,正确表示 `a` 在字母表中的位置。这样的计算方式确保了每个字母都能被转换成其正确的字母表顺序位置。

转换后的数字字符串长度取决于原始字符串 `s` 的长度和字符。例如,字母 `z` 转换后是 `26`,三个字符长度。对于一个长字符串,这种转换可能导致非常长的数字字符串,从而增加内存消耗。如果 `s` 非常长或包含多个接近 `z` 的字符,生成的数字字符串可能会占用显著的内存空间。在极端情况下,这可能导致性能问题或内存溢出,尤其是在内存受限的系统上。

是的,如果 `k` 特别大而数字位数已经变得很小,继续执行剩余的操作可能没有实际意义。例如,如果数字已经减少到个位数,继续进行相加的操作会得到相同的数字。在这种情况下,可以在达到某个点后提前终止操作,以避免不必要的计算。然而,题解中没有提供这种优化,因此即使是非必要的操作也会被执行,直到完成指定的 `k` 次操作。

尽管在某些特定的数学问题中可以使用公式或数学性质来优化运算,但在这个特定的问题中,由于每一步操作都依赖于前一步的结果,目前没有已知的简单数学公式可以直接替代多次迭代过程。每次操作都涉及将所有数字相加,这个结果本身会影响下一次迭代的结果。因此,除非可以确定数字已经达到稳定状态(如前一个问题所述的情况),否则我们需要执行所有 `k` 次操作来确保正确的结果。