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

100 阅读5分钟

引言

在编程学习与实践过程中,深入分析各类问题并总结解题思路和代码实现方式是提升能力的重要途径。本次针对题库中的不同整数的计数问题展开详细剖析,并分享个人在探索过程中的学习心得。

题目具体描述

image.png

题目关键信息

  • 输入数据:

    给定一个字符串 word,该字符串由数字和小写英文字母组成。

  • 字符串处理要求:

    需要替换字符串中的每个非数字字符(小写英文字母)为空格。

  • 整数提取:

    替换后的字符串会包含多个数字序列(由空格分隔)。

  • 去除前导零:

    数字序列需要去除前导零,即 "001" 和 "1" 应该被认为是相同的数字。

  • 不同整数的计数:

    要统计不同整数的数目。两个整数只有在它们的十进制表示不含前导零且数值不同的情况下才认为是不同的整数。

解题思路

1. 替换非数字字符

首先,我们需要遍历字符串 word,将其中的每一个非数字字符(小写字母)替换为空格。这样,所有的数字会被空格隔开,形成多个数字块。

例如,字符串 "a123bc34d8ef34" 经过替换后变成 " 123 34 8 34"。

2. 分割数字块

替换后的字符串中会包含多个数字块,它们由空格分隔开。我们可以通过 split() 方法将这些数字块分割成列表。

例如,字符串 " 123 34 8 34" 通过 split() 可以得到 ["123", "34", "8", "34"]。

3. 去除前导零

每个数字块在转换为整数时,应该去除前导零,因为 "001" 和 "1" 应该被认为是相同的数字。我们可以使用 int() 函数来将字符串转化为整数,int() 会自动去除前导零。

例如,"001" 转换为整数后变成 1,而 "34" 和 "034" 转换后都变成 34。

4. 统计不同的整数

将所有去除前导零后的数字存入一个集合 set 中,集合会自动去除重复的元素。最终,集合的大小即为不同整数的数量。

例如,对于数字 ["123", "34", "8", "34"],经过去除前导零后会变成 [123, 34, 8, 34],集合会去除重复的 34,最终集合为 {123, 34, 8},大小为 3。

5. 返回结果

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

Python代码

def solution(word: str) -> int:
    # Step 1: Replace non-digit characters with spaces
    word = ''.join(char if char.isdigit() else ' ' for char in word)
    
    # Step 2: Split the string by spaces to get all numeric substrings
    numbers = word.split()
    
    # Step 3: Remove leading zeros and add to a set to ensure uniqueness
    unique_numbers = set(int(num) for num in numbers)
    
    # Step 4: Return the size of the set, which gives the number of unique integers
    return len(unique_numbers)

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

代码主要步骤

  1. 替换非数字字符为空格
word = ''.join(char if char.isdigit() else ' ' for char in word)

这一行代码的作用是遍历输入字符串 word 中的每个字符。 如果字符是数字(通过 char.isdigit() 判断),就保留该字符;如果是非数字字符(如字母或其他符号),则将其替换为空格 ' '。这样,所有数字字符之间用空格隔开,非数字字符被去除。

  1. 分割字符串为数字块
numbers = word.split()

使用 split() 方法将字符串按空格分割成多个子字符串。每个子字符串都是一个由数字组成的数字块。这个操作会返回一个包含数字字符串的列表。 3. 去除前导零并存入集合

unique_numbers = set(int(num) for num in numbers)

对 numbers 列表中的每个数字字符串,使用 int(num) 将其转换为整数,这会自动去除数字中的前导零。然后将每个整数存入集合 set() 中。集合会自动去除重复的整数。因此,这个步骤会去除所有重复的数字。

  1. 返回不同整数的数量
return len(unique_numbers)

最后,返回集合 unique_numbers 的大小,即其中不同整数的个数。因为集合会去重,所以集合中的元素个数就是不同整数的数量。

总结

该问题的核心目标是从一个包含数字和字母的混合字符串中提取不同的整数,并计算这些整数的个数。整数的定义要求去除前导零,即 "001" 和 "1" 被认为是相同的数字。

关键点在于

  1.  字符串替换:通过 ''.join() 和 char.isdigit() 实现非数字字符替换为空格,避免了额外的复杂操作。
  2.  数字提取:通过 split() 方法将替换后的字符串分割为多个数字块。
  3.  去重:通过将数字转换为整数并放入集合中,自动去除重复的数字,简化了去重操作。
  4. 计算结果:使用 len() 获取集合大小,返回不同整数的数量。

时间复杂度和空间复杂度

时间复杂度:

  1. 替换非数字字符和分割字符串的时间复杂度为 O(n),其中 n 是字符串的长度。
  2. 将数字转化为整数并存入集合的时间复杂度为 O(m),其中 m 是数字块的数量。
  3. 总体时间复杂度为 O(n)。

空间复杂度:

需要额外空间存储数字集合,因此空间复杂度为 O(m),其中 m 是数字块的数量。

这个解法高效且易于理解,能够处理包含字母和数字的混合字符串,正确统计不同的整数数量。通过利用集合的去重特性,简化了重复数字的处理。