问题描述
小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
实现思路
-
初始化变量:
l = 0:用于记录一个整数在原字符串word中的起始位置。nums = []:创建一个空列表,用于存储从原字符串中提取出来的整数字符串。
-
遍历字符串
word以提取整数字符串:- 通过一个循环
for r in range(1, len(word)):从字符串的第二个字符开始遍历到最后一个字符。这里使用r作为当前遍历到的字符的索引。 - 当满足
word[r] in '1234567890' and word[r - 1] not in '1234567890'条件时,意味着当前字符r是数字且它前面的字符不是数字,那么就将当前数字字符的位置r赋值给l,以此确定一个可能的整数的起始位置。 - 当满足
word[r] not in '1234567890' and word[r - 1] in '1234567890'条件时,意味着当前字符r不是数字但它前面的字符是数字,此时就将从起始位置l到当前位置r之前的这一段字符串(即一个完整的整数字符串)添加到nums列表中。
- 通过一个循环
-
处理字符串末尾是数字的情况:
- 通过
if word[-1] in '1234567890':判断字符串的最后一个字符是否为数字。如果是数字,就将从之前记录的起始位置l到字符串末尾的这一段字符串(也是一个可能的整数字符串)添加到nums列表中。
- 通过
-
统计不同整数的数目:
- 首先,通过列表推导式
[int(i) for i in nums]将nums列表中的每个整数字符串转换为对应的整数类型。 - 然后,使用
set()函数将这些整数转换为集合,集合的特性是会自动去除重复元素。所以len(set([int(i) for i in nums]))就能够得到不同整数的数目,也就是最终要返回的结果。
- 首先,通过列表推导式
实现代码
def solution(word: str) -> int:
l = 0
nums = []
for r in range(1, len(word)):
if word[r] in '1234567890' and word[r - 1] not in '1234567890':
l = r
if word[r] not in '1234567890' and word[r - 1] in '1234567890':
nums.append(word[l:r])
if word[-1] in '1234567890':
nums.append(word[l:])
return len(set([int(i) for i in nums]))