不同整数的计数问题
问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:
word = "a123bc34d8ef34"
输出:3
样例2:
输入:
word = "t1234c23456"
输出:2
样例3:
输入:
word = "a1b01c001d4"
输出:2
解题思路
-
替换非数字字符:
- 遍历给定的字符串,将其中所有的非数字字符替换为空格。这样,我们就能够用空格分隔出所有数字部分。
- 例如,对于字符串
"a123bc34d8ef34",替换后得到" 123 34 8 34"。
-
提取数字部分:
- 将替换后的字符串按空格进行分割,得到多个数字字符串。这样做可以将所有数字部分提取出来。
- 例如,分割
" 123 34 8 34"得到列表['123', '34', '8', '34']。
-
去除前导零:
- 对每个提取出的数字字符串,转换成整数。整数类型自动去除前导零,因此,
'001'、'01'、'1'都会被视为同一个整数1。 - 例如,数字
'01'会被转换成整数1。
- 对每个提取出的数字字符串,转换成整数。整数类型自动去除前导零,因此,
-
去重:
- 将去除前导零后的数字存入一个集合。集合的特性是自动去除重复的元素,因此只会保留不同的整数。
- 例如,数字
['123', '34', '8', '34']转换成整数后,集合将是{123, 34, 8},去除了重复的34。
-
返回不同整数的数量:
- 最后,返回集合的大小,即不同整数的数量。
- 例如,集合
{123, 34, 8}的大小为 3,表示有 3 个不同的整数。
步骤总结
- 遍历字符串,将非数字字符替换为空格。
- 分割字符串,提取出每个数字字符串。
- 转换为整数,去除数字字符串的前导零。
- 存入集合,确保每个整数只出现一次。
- 返回集合的大小,即不同整数的数量。
代码
def solution(word: str) -> int:
# 替换非数字字符为空格
modified_word = ''.join(c if c.isdigit() else ' ' for c in word)
# 分割字符串,提取数字
numbers = modified_word.split()
# 用集合存储去重后的整数
unique_numbers = set(int(num) for num in numbers)
# 返回集合的大小,即不同整数的数量
return len(unique_numbers)
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)
复杂度分析
- 时间复杂度:O(n),其中
n是字符串的长度。我们需要遍历每个字符,替换非数字字符并进行分割和处理。 - 空间复杂度:O(k),其中
k是数字部分的个数。我们需要一个集合来存储去重后的整数。