不同整数的计数问题 | 豆包MarsCode AI刷题

0 阅读5分钟

问题分析

这道题的核心是字符串处理和基本的集合操作。问题的主要任务是从一个混合了字母和数字的字符串中,找到所有不同的整数个数。这些整数满足两个要求:

  1. 它们是从字符串中提取出来的数字子串。
  2. 如果两个数字的十进制表示相同(无论前导零的数量),它们被视为相同。

例如,对于字符串 "a123bc34d8ef34"

  • 替换非数字字符后,我们会得到分隔的数字子串 ["123", "34", "8", "34"]
  • 数字 34 出现了两次,但十进制表示是相同的,所以它只算一次。

最终,我们得到三个不同的整数:123348


解题思路

为了解决这个问题,我的主要思路分为以下几步:

第一步:提取数字子串

我们需要从混合字符串中提取出所有连续的数字。这可以通过正则表达式轻松实现。

正则表达式是一种强大的字符串模式匹配工具。在 Python 中,可以使用 re 模块。对于这个问题,表达式 \d+ 非常合适:

  • \d 匹配任何一个数字字符(0-9)。
  • + 表示匹配一个或多个连续的数字。

因此,re.findall(r'\d+', word) 会找到所有数字子串,并返回一个字符串列表。例如:

  • 输入字符串 "a123bc34d8ef34",结果是 ["123", "34", "8", "34"]

第二步:去除前导零

题目明确指出,只有当两个整数的十进制表示不同(即不考虑前导零),它们才被视为不同。因此,我们需要将提取到的数字子串转换为整数:

  • 例如,"001" 转换为整数 1
  • 在 Python 中,直接使用 int() 函数可以轻松完成这一任务。int("001") 返回 1,而不会保留前导零。

第三步:统计不同的整数个数

将这些整数存储在一个集合(set)中:

  • 集合是一种无序的数据结构,具有自动去重的功能。
  • 当我们将所有整数放入集合中后,集合中元素的个数就是不同整数的数量。

第四步:返回结果

最后,我们只需要返回集合的大小,表示不同整数的个数。


实现代码

根据上述思路,代码如下:

python
Copy code
import re

def solution(word: str) -> int:
    # 使用正则表达式提取所有的数字子串
    numbers = re.findall(r'\d+', word)
    
    # 转换为整数,消除前导零,并存储到集合中
    unique_numbers = set(int(num) for num in numbers)
    
    # 返回集合中不同整数的个数
    return len(unique_numbers)

if __name__ == '__main__':
    print(solution("a123bc34d8ef34") == 3)
    print(solution("t1234c23456") == 2)
    print(solution("a1b01c001d4") == 2)

知识点讲解

1. 正则表达式

正则表达式是处理字符串的重要工具。通过模式匹配,可以快速提取、替换或验证字符串中的特定内容。

  • \d 匹配数字。
  • + 表示匹配一个或多个连续的前一个模式。
  • re.findall(pattern, string) 返回字符串中所有匹配的内容,作为一个列表。

在这道题中,re.findall(r'\d+', word) 的作用是提取所有连续的数字子串。

2. 集合去重

集合(set)是一种无序、不可重复的容器。在 Python 中,集合非常适合解决去重问题。

  • 如果我们将一个列表中的元素逐一添加到集合中,集合会自动移除重复的元素。
  • 在这道题中,所有数字转换为整数后存入集合,就完成了去重的操作。

3. 转换为整数去除前导零

在 Python 中,使用 int() 函数可以轻松将字符串转换为整数。转换时会自动去掉前导零。例如:

python
Copy code
int("001")  # 返回 1
int("123")  # 返回 123

这是解决前导零问题的核心技巧。

4. 复杂度分析

  • 时间复杂度

    • 提取数字子串的复杂度是 O(n),其中 n 是字符串的长度。
    • 转换为整数并存入集合的复杂度是 O(k),其中 k 是提取出的数字子串的数量。
    • 总时间复杂度为 O(n + k)
  • 空间复杂度

    • 使用了一个列表存储数字子串,以及一个集合存储不同的整数。
    • 空间复杂度为 O(k)

示例分析

示例1:"a123bc34d8ef34"

  1. 提取的数字子串:["123", "34", "8", "34"]
  2. 转换为整数:{123, 34, 8}
  3. 不同整数数量:3 输出为 3

示例2:"t1234c23456"

  1. 提取的数字子串:["1234", "23456"]
  2. 转换为整数:{1234, 23456}
  3. 不同整数数量:2 输出为 2

示例3:"a1b01c001d4"

  1. 提取的数字子串:["1", "01", "001", "4"]
  2. 转换为整数:{1, 4}
  3. 不同整数数量:2 输出为 2

总结

通过正则表达式提取数字子串,使用整数转换消除前导零,结合集合去重,我们高效地解决了这道问题。整个过程体现了字符串处理与数据结构结合的思想。