不同整数的计数问题
这个问题的核心是将字符串中的字母替换为空格,以便只保留数字子串,然后去掉数字的前导零后,统计其中不同的整数个数。我们可以使用 Python 的正则表达式来提取数字部分,并通过集合去重。
解题思路
-
提取数字:将字符串
word
中的非数字字符替换为空格,从而分隔出数字子串。可以用正则表达式\d+
提取字符串中的所有数字子串。 -
去除前导零:提取出的每个数字子串可能含有前导零,我们需要去掉这些零,使得 "01"、"001" 等被视为同一个整数。例如,"001" 和 "1" 应该被当作相同的整数。
-
使用集合去重:将处理过的整数子串存入集合中,集合会自动去掉重复的元素。最后集合的长度即为不同整数的个数。
代码实现
import re
def solution(word: str) -> int:
# 提取所有数字子串
numbers = re.findall(r'\d+', word)
# 去除前导零并存入集合中
unique_numbers = {str(int(num)) for num in numbers}
# 返回集合大小,即不同整数的数量
return len(unique_numbers)
# 测试用例
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3) # 输出应为 3
print(solution("t1234c23456") == 2) # 输出应为 2
print(solution("a1b01c001d4") == 2) # 输出应为 2
代码关键点解析
-
re.findall(r'\d+', word)
:使用正则表达式\d+
提取所有数字子串。每个数字子串都是连续的数字字符。 -
去除前导零:
{str(int(num)) for num in numbers}
这一行利用int(num)
转换字符串为整数,从而自动去掉前导零,再将结果转为字符串存入集合unique_numbers
。因为整数1
和01
转换后都是1
,因此它们会被当作同一个整数。 -
集合去重:使用集合来存储整数,可以直接去重,避免重复。
测试用例分析
-
样例1:
word = "a123bc34d8ef34"
- 提取数字子串为
["123", "34", "8", "34"]
- 去重后得到
{"123", "34", "8"}
,最终不同整数的个数是3
。
- 提取数字子串为
-
样例2:
word = "t1234c23456"
- 提取数字子串为
["1234", "23456"]
- 去重后得到
{"1234", "23456"}
,不同整数的个数是2
。
- 提取数字子串为
-
样例3:
word = "a1b01c001d4"
- 提取数字子串为
["1", "01", "001", "4"]
- 去重后得到
{"1", "4"}
,不同整数的个数是2
。
- 提取数字子串为
思考与总结
此题采用了正则表达式和集合去重的组合方法,确保高效提取数字并去除重复。通过正则表达式提取数字可以很方便地处理混合字符串中的数字部分。而通过 int
转换去除前导零,避免了手动处理复杂的前导零问题。总体来看,这种方法高效、简洁,适用于大部分类似字符串处理的问题。
这种算法的核心思想是字符串的正则表达式匹配与集合去重。