题目解析: 不同整数的计数问题 | 豆包MarsCode AI刷题

189 阅读4分钟

1. 题目描述

我们有一个由小写字母和数字组成的字符串 word。要求我们将所有的非数字字符替换为空格,保留数字,形成一个新的字符串。然后从这个新字符串中提取出整数,并统计出不同整数的数量。这里的“不同”是指去除前导零后的不同十进制整数。

示例: 给定字符串 "a123bc34d8ef34",替换后的字符串是 " 123 34 8 34",其中整数部分为 "123""34""8""34"。去重后,不同的整数有 "123""34""8",数量为 3。

问题分析

  1. 字符串替换:将字符串 word 中的每一个非数字字符替换为空格,以便我们可以将数字隔离出来。
  2. 提取整数:使用字符串的分割功能来提取所有被空格分隔的数字部分。这些部分就是我们所需的整数。
  3. 去掉前导零:为了确保数字的唯一性,我们需要去掉每个数字的前导零(例如:"001""1" 应视为同一个数字)。
  4. 统计不同的整数: 使用集合来存储这些处理过的整数。集合的特性可以帮助我们自动去重。
  5. 返回集合的大小:集合的大小即为不同整数的个数。

2. 解答思路

解决这个问题的思路可以分为以下几个步骤:

  1. 字符替换: 将 word 中的所有非数字字符替换为空格,方便分离出各个数字段。
  2. 提取数字: 使用空格分隔替换后的字符串,提取出所有的数字段。
  3. 去除前导零并去重: 将每个数字段转换为整数,这样会自动去除前导零,然后用集合存储这些整数。集合的特性可以自动去重。
  4. 返回不同整数的数量: 最后,返回集合的大小作为不同整数的数量。

3. 代码分析

def num_different_integers(word: str) -> int:
    # Step 1: 用空格替换所有非数字字符
    for char in word:
        if not char.isdigit():
            word = word.replace(char, ' ')

解释

  • 这里使用了一个 for 循环遍历字符串中的每一个字符。
  • 如果字符 char 不是数字,我们将其替换为空格。这样在最终的 word 中,所有非数字字符都变成了空格。
    # Step 2: 分割字符串以提取整数
    numbers = word.split()

解释

  • 使用 word.split() 将字符串按空格分隔成单个的数字串列表 numbers。空格间的部分被拆分出来,使得列表中的每个元素都是一个数字串。
    # Step 3: 去掉前导零并将整数存入集合
    unique_numbers = {str(int(num)) for num in numbers}

解释

  • 使用集合推导式来处理 numbers 中的每个数字串 num

    • int(num) 将数字串转换为整数,会自动去掉前导零。
    • str(int(num)) 再将整数转换回字符串,以保证我们处理的是字符串格式的数字。
    • 集合 {...} 可以自动去重,因此 unique_numbers 集合中的每个元素都是不同的整数字符串。
    # Step 4: 返回集合的大小,即不同整数的个数
    return len(unique_numbers)

解释

  • len(unique_numbers) 计算集合中元素的数量,即不同整数的个数。

4. 总结反思和扩展

总结

本题通过将非数字字符替换为空格,然后提取整数并去除前导零实现了对不同整数数量的统计。使用集合的特性,使得去重操作非常方便。代码逻辑清晰且效率较高,适用于较长的字符串。

反思

在实现过程中,可以注意到 for 循环替换字符的部分,可能会在大字符串上造成效率问题,因为每次替换操作都重新生成了一个新的字符串。可以改用正则表达式一次性替换所有非数字字符,从而优化性能。

扩展
  • 扩展功能:如果要统计不同整数出现的次数,可以在每次转换整数时,将整数放入字典中统计其频率。
  • 适应性扩展:如果题目中涉及的是包含其他类型字符的字符串,例如大写字母或特殊字符,解法中使用正则表达式会更灵活。

一个基于正则表达式的改进示例如下:

import re
def num_different_integers(word: str) -> int:
    # 使用正则表达式替换非数字字符
    numbers = re.findall(r'\d+', word)
    # 去掉前导零并去重
    unique_numbers = {str(int(num)) for num in numbers}
    return len(unique_numbers)

这种方法在效率和可读性上都更好一些。