分析与解答:统计不同的整数

164 阅读5分钟

一、问题概述

给定一个包含数字和小写字母的字符串 word,我们的目标是从中提取出所有不同的整数。提取过程中,所有非数字字符应当被忽略,并且所有提取出的数字需要去掉前导零。最终,我们需要统计出这些不同整数的个数。

二、问题解读

字符串 word 中包含了数字和字母,而我们关心的部分是其中的数字序列。数字序列可以被字母、符号等非数字字符分隔开。我们需要:

  1. 去掉字符串中的所有非数字字符。
  2. 提取出所有数字序列,并确保每个数字序列去掉了前导零。
  3. 统计去重后的数字序列数量。

例如,对于字符串 "a123bc34d8ef34",应该输出 3,因为在去除字母并去掉前导零后,提取出的不同整数是 123, 34, 和 8

三、解题思路

要解决这个问题,我们可以将其分为以下几个步骤:

  1. 替换非数字字符:首先,我们需要将所有非数字字符(即字母或符号)替换为空格。这样可以将数字序列从字母和符号中分离出来,方便后续处理。
  2. 提取数字序列:通过分割字符串,获取到所有的数字序列。由于我们已将字母转换为空格,分割后的结果将只包含数字部分。
  3. 去除前导零:对于每个数字序列,我们需要去除其中的前导零。这里可以借助 Python 的 int() 函数,int() 会自动去除数字字符串中的前导零。
  4. 去重并计数:我们使用一个集合(set)来存储这些数字。集合的特点是自动去除重复元素,因此它非常适合用来去重。
  5. 返回不同整数的数量:最后,我们只需要返回集合中的元素个数,即为不同整数的数量。

四、具体实现

1. 替换非数字字符

为了方便提取数字,我们可以使用正则表达式将所有非数字字符替换为空格。re.sub(r'\D', ' ', word) 可以完成这一操作,其中 \D 表示匹配所有非数字字符。

2. 分割数字部分

使用 split() 方法将替换后的字符串按空格分割成多个部分,每个部分即为一个可能的数字字符串。

3. 去除前导零

为了去除前导零,我们可以直接将每个数字字符串转换成整数。Python 中的 int() 函数会自动去除前导零。

4. 使用集合去重

为了确保每个数字只计数一次,我们将所有的整数放入一个集合中。集合自动去重,因此无需手动检查重复的数字。

5. 返回结果

最后,返回集合的大小,即为不同整数的数量。

五、代码实现

pythonCopy Code
import re

def num_different_integers(word: str) -> int:
    # 使用正则表达式替换非数字字符为空格
    word = re.sub(r'\D', ' ', word)  # \D表示匹配任何非数字字符
    
    # 分割字符串并去除空字符串
    numbers = word.split()
    
    # 使用集合去重,去除前导零
    unique_numbers = set(int(num) for num in numbers)
    
    # 返回不同整数的数量
    return len(unique_numbers)

六、代码解析

  1. 替换非数字字符

    • 我们通过 re.sub(r'\D', ' ', word) 将所有非数字字符替换为空格。r'\D' 是正则表达式,表示匹配任意非数字字符。
  2. 分割字符串

    • 使用 split() 方法按空格将字符串分割成多个部分。每个部分代表一个数字字符串。注意,多个连续的空格会被忽略,因此我们得到的结果是一个包含所有数字的列表。
  3. 去重并去除前导零

    • 通过 int(num) 将每个数字字符串转换成整数,去除前导零。然后,我们将这些整数存储在集合 unique_numbers 中,集合会自动去重。
  4. 返回不同整数的数量

    • 最后,返回集合 unique_numbers 的大小,即为不同整数的数量。

七、复杂度分析

1. 时间复杂度

  • 替换非数字字符:re.sub() 需要遍历整个字符串,因此时间复杂度为 O(n),其中 n 是字符串的长度。
  • 分割字符串:split() 方法遍历整个字符串,时间复杂度也是 O(n)。
  • 去重与转换为整数:遍历所有数字字符串并将其转换为整数,时间复杂度为 O(m),其中 m 是数字的数量。最大情况下,m 等于 n(字符串长度)。
  • 因此,整体时间复杂度是 O(n)。

2. 空间复杂度

  • 存储数字的集合需要 O(m) 空间,其中 m 是不同整数的数量。最大情况下,m 等于 n(每个数字都不同)。
  • 替换操作会生成一个新的字符串,需要 O(n) 空间。
  • 因此,整体空间复杂度是 O(n)。

八、测试用例

测试用例1

pythonCopy Code
word = "a123bc34d8ef34"
print(num_different_integers(word))  # 输出 3

解析:去除字母后,得到数字 123, 34, 8, 其中 34 重复,因此不同整数为 3 个。

测试用例2

pythonCopy Code
word = "t1234c23456"
print(num_different_integers(word))  # 输出 2

解析:去除字母后,得到数字 123423456,它们是不同的整数,因此输出 2。

测试用例3

pythonCopy Code
word = "a1b01c001d4"
print(num_different_integers(word))  # 输出 2

解析:去除字母后,得到数字 1, 1, 1, 4,去除重复并去掉前导零后,不同的整数为 14,因此输出 2。

九、总结

本题的关键是如何处理和提取字符串中的数字,尤其是去除非数字字符、去除前导零以及去重。使用正则表达式和 Python 内置的集合功能,可以高效地解决这一问题。通过上述解法,我们能够在较短时间内获得准确的结果。