问题描述
小 R 有一个由数字和小写英文字母组成的字符串 word。他打算通过将每个非数字字符替换为空格,之后统计在替换后所剩下的整数中,不同整数的数目。需要注意的是,只有当两个整数的不含前导零的十进制表示不同时,才认为它们是不同的整数。
示例:
-
输入:
word = "a123bc34d8ef34"- 输出:
3 - 解析:替换后为
" 123 34 8 34",剩下的整数为123、34、8和34,其中不同的整数为123、34和8,共计 3 个不同整数。
- 输出:
-
输入:
word = "t1234c23456"- 输出:
2 - 解析:替换后为
" 1234 23456",剩下的整数为1234和23456,共计 2 个不同整数。
- 输出:
-
输入:
word = "a1b01c001d4"- 输出:
2 - 解析:替换后为
" 1 01 001 4",剩下的整数为1和4,共计 2 个不同整数。
- 输出:
思路解析
本题的关键在于如何准确地进行字符串处理,特别是如何去掉前导零并准确判断整数的唯一性。我们可以将问题分解为以下几个步骤:
- 字符替换:遍历输入字符串,将不是数字的字符替换为空格。
- 数字提取:通过分割替换后的字符串获取所有的数字字符串。
- 去除前导零并判断整数唯一性:对每个提取的数字字符串,去除前导零并将其加入集合中,利用集合的去重特性来统计不同的整数。
- 返回结果:返回集合中不同整数的数量。
解题步骤
- 替换字符
遍历输入字符串,将每一个非数字字符替换为空格。这样能够确保数字之间不会被字母或其他字符干扰。 - 提取数字
将替换后的字符串通过空格分割,得到数字字符串的列表。每个分割得到的部分即为一个可能的数字。 - 去除前导零
对每个数字字符串,去除其前导零。可以使用.lstrip("0")方法去除前导零。如果一个数字字符串去除前导零后为空(即原本为零或仅包含零的数字),则将其视为 "0"。 - 使用集合存储去重的整数
将去除前导零后的数字字符串存入集合,集合的特性自动去除重复的数字。 - 返回结果
最终,返回集合的大小,即不同整数的个数。
代码实现
python
def solution(word: str) -> int:
# 替换非数字字符为空格
replaced_word = "".join(" " if not char.isdigit() else char for char in word)
# 提取数字字符串
numbers = replaced_word.split()
# 使用集合存储不同的整数
unique_numbers = set()
for num in numbers:
# 去掉前导零,若为空则设为 "0"
num_without_leading_zeros = num.lstrip("0") or "0"
unique_numbers.add(num_without_leading_zeros)
# 返回不同整数的个数
return len(unique_numbers)
优化与分析
-
时间复杂度
- 遍历字符串
word,进行字符替换的操作时间复杂度为 O(n)O(n)O(n),其中 nnn 为字符串的长度。 - 遍历提取出来的数字字符串列表
numbers,进行去前导零的操作并添加到集合中的时间复杂度为 O(m)O(m)O(m),其中 mmm 是提取出的数字字符串的数量,通常 m≤nm \leq nm≤n。 - 整体时间复杂度:由于这两个操作是顺序进行的,所以整体时间复杂度为 O(n)O(n)O(n)。
- 遍历字符串
-
空间复杂度
- 替换后的字符串
replaced_word占用空间最多为 O(n)O(n)O(n)。 - 数字字符串列表
numbers占用空间最多为 O(m)O(m)O(m),其中 mmm 是数字字符串的数量,通常 m≤nm \leq nm≤n。 - 存储不同整数的集合
unique_numbers占用空间最多为 O(k)O(k)O(k),其中 kkk 是不同整数的数量,通常 k≤m≤nk \leq m \leq nk≤m≤n。 - 整体空间复杂度:因此,整体空间复杂度为 O(n)O(n)O(n)。
- 替换后的字符串
知识总结与心得
-
字符串处理技巧
- 对于需要按照特定规则对字符串进行处理的问题,遍历字符串并结合条件判断语句非常重要。通过遍历字符串,可以灵活地对每个字符进行判断和操作。
- 通过使用
.lstrip("0")方法,我们能够高效去除数字中的前导零,保证数字的正确性。
-
集合在去重中的应用
- 集合是一个非常适合用来去重的数据结构。在本题中,使用集合存储去除前导零后的数字字符串,能够简化代码并确保每个数字只被统计一次。
- 对于需要统计唯一元素个数的问题,集合是一个非常高效的选择。
-
思维拓展
- 在面对字符串处理和数字转换时,尤其要注意细节问题。例如如何处理前导零、空字符串等特殊情况。通过这道题的练习,我更加熟悉了如何有效地处理这类问题。
- 集合的应用使得我们能够迅速解决去重的问题,但我们仍然需要关注如何有效地转换字符串和数值,尤其是在有特定格式要求时。
实际经验
通过这道题的实践,我掌握了如何灵活处理字符串中的数字与非数字字符,并利用 Python 的强大字符串处理方法(如 .lstrip())和集合去重特性,使问题得到了简洁有效的解决。在实际编程中,要根据问题的特点选择合适的数据结构,像集合这样自动去重的结构,在需要去重统计时特别高效。
测试用例
python
print(solution("a123bc34d8ef34")) # 输出: 3
print(solution("t1234c23456")) # 输出: 2
print(solution("a1b01c001d4")) # 输出: 2
print(solution("a0000b")) # 输出: 1
print(solution("abc")) # 输出: 0
通过这道题的思考和实现,我们不仅解决了一个具体的编程问题,还提高了自己在字符串和集合操作中的熟练度。希望这篇文章能够为大家提供一些帮助,在实际刷题过程中能更有效地运用这些技巧。
总结
本题通过对字符串的处理,特别是数字和非数字字符的分离,以及前导零的去除,帮助我们更好地理解如何在编程中有效地使用字符串操作和集合数据结构。