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

33 阅读3分钟

问题描述

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

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

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。

步骤:

  1. 正则表达式替换:首先,使用正则表达式 re.sub(r'[^\d]', ' ', word) 将输入字符串 word 中所有非数字字符替换为空格。这样做的目的是将字符串中的数字与其他字符隔离开。
  2. 分割字符串:接着,使用 split() 方法将处理过的字符串按照空格分割成多个部分。每个部分都是一个由数字组成的字符串。
  3. 创建集合:创建一个空集合 unique_integers,用于存储分割后字符串中转换成的不同整数。
  4. 转换整数并去重:遍历分割后的字符串列表 parts,对每个部分调用 int() 函数将其转换为整数(int() 会自动去除字符串前导的零),然后将这些整数添加到集合 unique_integers 中。由于集合不允许重复元素,所以相同的整数只会被存储一次。
  5. 返回结果:最后,返回集合 unique_integers 的大小,即集合中不同整数的数量。

代码:

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)

# 测试样例
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)

时间复杂度:

  • 正则表达式替换操作的时间复杂度为 O(n),其中 n 是输入字符串的长度。
  • 分割字符串操作的时间复杂度也为 O(n),因为需要遍历整个字符串。
  • 遍历分割后的字符串列表并转换为整数的时间复杂度为 O(m),其中 m 是分割后字符串列表的长度。
  • 总体时间复杂度为 O(n + m),在大多数情况下,m 不会大于 n,因此可以简化为 O(n)。

空间复杂度:

  • 分割后的字符串列表 parts 的大小取决于输入字符串中数字的数量,因此空间复杂度为 O(m)。
  • 集合 unique_integers 的大小取决于不同整数的数量,其空间复杂度最坏情况下为 O(m)。
  • 总体空间复杂度为 O(m),即与输入字符串中数字的数量成线性关系。