不同整数计数问题 | 豆包MarsCode AI刷题

35 阅读2分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。 当然,以下是解决这个问题的详细解答:

思路

  1. 提取数字:首先,我们需要从字符串中提取出所有的数字。这可以通过正则表达式实现,正则表达式能够匹配所有非数字字符,并将它们替换为空格。
  2. 分割字符串:将处理过的字符串按空格分割,得到一系列由数字组成的字符串。
  3. 去除前导零并转换为整数:由于字符串中的数字可能包含前导零,我们需要在转换为整数之前去除它们。整数转换会自动处理前导零。
  4. 去重并计数:使用集合来存储不同的整数,因为集合会自动去除重复的元素。最后,集合的大小就是不同整数的数量。

具体步骤

  1. 使用正则表达式 re.sub(r'[^\d]', ' ', word) 将字符串中的所有非数字字符替换为空格。
  2. 使用 split() 方法将处理过的字符串按空格分割成多个部分。
  3. 遍历分割后的字符串列表,对每个部分使用 int() 函数转换为整数,并添加到集合中。
  4. 返回集合的大小。

代码

import re
def solution(word: str) -> int:
word = re.sub(r'[^\d]', ' ', word)
parts = word.split()
unique_integers = set()
for part in parts:
    num = int(part)  # int() 函数会自动清除前导零
    unique_integers.add(num)
return len(unique_integers)

知识点

  • 正则表达式:用于匹配字符串中的特定模式。
  • 字符串处理:使用 split()int() 方法处理和转换字符串。
  • 集合:用于存储唯一元素,自动去除重复项。

时间复杂度

  • 正则表达式替换:假设字符串长度为 nn,则正则表达式替换的时间复杂度为 O(n)O(n)
  • 分割字符串:分割操作的时间复杂度也是 O(n)O(n)
  • 转换和去重:假设有 mm 个数字字符串,则转换和去重的时间复杂度为 O(m)O(m)。 总的时间复杂度为 O(n+m)O(n + m),其中 mnm \leq n

空间复杂度

  • 分割后的字符串列表:空间复杂度为 O(m)O(m)
  • 集合:空间复杂度为 O(m)O(m)。 总的空间复杂度为 O(m)O(m)。 在实际情况中,mm 通常远小于 nn,因此我们可以认为这个算法在时间和空间上都是高效的。