问题
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
要解决这个问题,主要分为以下几个步骤:
- 替换字符:首先,遍历字符串,将每个非数字字符替换为空格。
- 分割字符串:用空格分割字符串,得到数字的部分。
- 去重和去前导零:去除前导零后,统计唯一的数字字符串。
具体实现步骤:
- 遍历字符串,如果是数字就保留,否则替换为空格。
- 分割字符串,以空格为分隔符,得到所有数字部分。
- 去除前导零:每个数字字符串需要去掉前导零,可以通过
str.lstrip('0')来实现。 - 去重:将去掉前导零后的数字存入一个集合(set),自动去重。
完整代码实现:
def solution(word: str) -> int:
# 替换非数字字符为空格
transformed = ''.join(c if c.isdigit() else ' ' for c in word)
# 按空格分割字符串,得到所有的数字部分
numbers = transformed.split()
# 去除前导零后,存入集合去重
unique_numbers = set(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
代码解析:
- 替换非数字字符:
''.join(c if c.isdigit() else ' ' for c in word)遍历每个字符,如果是数字,则保留字符,否则替换为空格。 - 分割字符串:
transformed.split()根据空格将字符串分割成多个数字字符串。 - 去除前导零并去重:通过
int(num)去掉数字字符串中的前导零(整数会自动去掉前导零),然后转回字符串存入集合unique_numbers。 - 返回结果:集合中的元素是唯一的,最终通过
len()返回集合的大小,表示不同整数的数目。
运行结果:
- 对于输入
"a123bc34d8ef34",会输出3。 - 对于输入
"t1234c23456",会输出2。 - 对于输入
"a1b01c001d4",会输出2。