不同整数的计数问题
问题描述
小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
问题题解
问题理解
依据问题的要求,我们需要将一个由数字和小写英文字母组成的字符串中的英文字母部分替换为空格,然后统计剩下的整数中不同的数目。
解题思路
这些步骤应该如何实现呢?
- 将字符串中的小写英文字母部分替换为空格,很显然这里适合用正则表达式进行处理,使用python提供的
re库,可以很容易完成这一步。 - 由于我们需要统计剩下的整数中不同整数的数目,因此有必要将现在这个由数字和空格组成的字符串进行分割,显而易见,我们应该以空格作为分隔符进行分割,这样就能得到各个整数。
- 统计不同的整数个数,即需要对数据去重,可以想到使用python的
set集合来去重。这是基于python集合会自动去重的特性,我们将整数依次添加到一个set中,最后获得的set的长度即为问题结果。 - 在将数据加入
set集合之前,由于数据可能存在前导零,我们使用字符串的lstrip()方法可以完成这一点。
算法步骤
- 使用
re.sub()方法,将字符串中的小写英文字母部分替换为空格,获得由数字和空格组成的字符串,且空格作为各个数字的分隔符。 - 使用python字符串的
split()方法,将字符串分割为一个个整数,获得一个字符串列表,其中每个元素均是整数字符串。 - 使用python字符串的
lstrip()方法,去除每个元素中可能存在的前导零。 - 遍历字符串列表,将每个元素加入
set集合中。 - 返回集合的长度,即为不同整数的计数结果。
代码示例
import re
def solution(word: str) -> int:
digits=re.sub(r'[a-z]+',' ',word).split()
unique_int=set()
for digit in digits:
digit=digit.lstrip('0')
if digit!='' or digit!='0':
unique_int.add(digit)
return len(unique_int)