题目
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
解题思路
1. 过滤出数字
首先,我们需要从字符串中提取出所有的数字部分。非数字字符(字母和符号)应该被替换为空格,这样我们可以清楚地得到由数字构成的子字符串。
2. 去除前导零
对于每一个数字字符串,我们需要去除可能存在的前导零。比如 "00123" 和 "123" 应该视为相同的整数。所以在提取数字字符串时,我们需要确保每个数字字符串是不包含前导零的。
3. 统计不同的整数
一旦提取出所有的数字部分并去除前导零后,我们就可以将它们存储在一个集合中。集合会自动去除重复元素,因此最终集合的大小就是我们需要的答案——不同整数的数目。
豆包MarsCode AI给出的完善后的步骤详解
-
替换非数字字符为空格:
使用 Python 中的正则表达式(
re模块)来替换非数字字符为空格。或者,简单的方法是逐字符遍历字符串,遇到字母就替换为空格,遇到数字就保留。 -
提取数字子串:
通过拆分字符串,将数字部分提取出来。拆分时,空格会成为分隔符。
- 去除前导零:
对于每个数字子串,使用 Python 内建的 int() 函数将字符串转换为整数。int() 会自动去除前导零。如果该数字字符串全是零,int("000") 会变为 0。
- 去重统计:
将每个转换后的整数加入一个集合中。集合会自动去除重复元素,因此最终集合的大小就是我们需要的答案。
代码实现
python
代码解读
复制代码
def solution(word: str) -> int:
# Step 1: Replace non-digit characters with spaces
modified_word = ''.join(c if c.isdigit() else ' ' for c in word)
# Step 2: Split the string by spaces to get a list of number substrings
numbers = modified_word.split()
# Step 3: Remove leading zeros and store in a set to ensure uniqueness
unique_numbers = set(int(num) for num in numbers)
# Step 4: Return the size of the set, which is the count of unique integers
return len(unique_numbers)
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)
时间复杂度分析
-
正则表达式匹配:会遍历整个字符串,时间复杂度为 O(n),其中 n 是字符串的长度。
-
去重和整数转换:我们需要遍历所有提取出的数字子串,并将每个数字转换为整数,这一过程的时间复杂度为 O(m),其中 m 是提取出的数字子串的数量。
-
因此,整体时间复杂度是 O(n),其中 n 是输入字符串的长度。