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

83 阅读3分钟

不同整数的计数问题

问题理解

  1. 输入:一个由数字和小写英文字母组成的字符串 word
  2. 目标:将字符串中的非数字字符替换为空格,然后统计替换后剩下的整数中不同整数的数目。
  3. 要求:只有当两个整数的十进制表示(不含前导零)不同,才认为它们是不同的整数。

关键步骤

  1. 正则表达式替换re.sub(r'\D', ' ', word)

    • 将所有非数字字符替换为空格。
  2. 提取整数re.findall(r'\d+', word)

    • 提取字符串中的所有连续数字序列。
  3. 去重和去除前导零set(int(num) for num in numbers)

    • 将每个数字字符串转换为整数,并存储在集合中。
  4. 统计不同整数的数量len(unique_numbers)

    • 返回集合的大小。

代码分析

根据代码提示

import re

def solution(word: str) -> int:
    # 将非数字字符替换为空格
    word = re.sub(r'\D', ' ', word)
    
    # 使用正则表达式提取所有整数
    numbers = re.findall(r'\d+', word)
    
    # 使用集合去重
    unique_numbers = set(numbers)
    
    # 返回不同整数的数量
    return len(unique_numbers)

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

逐行分析

  1. 导入正则表达式模块

    import re
    

    这是正确的,正则表达式模块 re 是处理字符串匹配和替换的常用工具。

  2. 定义 solution 函数

    def solution(word: str) -> int:
    

    函数定义正确,接受一个字符串参数 word,并返回一个整数。

  3. 将非数字字符替换为空格

    word = re.sub(r'\D', ' ', word)
    

    这里使用 re.sub 将所有非数字字符替换为空格。这是正确的,但需要注意,如果字符串中包含多个连续的非数字字符,替换后会形成多个连续的空格。

  4. 使用正则表达式提取所有整数

    numbers = re.findall(r'\d+', word)
    

    这里使用 re.findall 提取所有连续的数字序列。这是正确的,但需要注意,提取的数字可能包含前导零。

  5. 使用集合去重

    unique_numbers = set(numbers)
    

    使用集合去重是正确的,但需要确保去重后的数字不包含前导零。

  6. 返回不同整数的数量

    return len(unique_numbers)
    

    返回集合的长度,即不同整数的数量。这是正确的。

给出建议

  1. 处理前导零: 题目要求统计的整数不应包含前导零。你可以在提取数字后,去除前导零。

  2. 优化正则表达式: 可以考虑在替换非数字字符时,直接将它们替换为空字符串,而不是空格,这样可以避免后续处理连续空格的问题。

改进后的代码

import re

def solution(word: str) -> int:
    # 将非数字字符替换为空字符串
    word = re.sub(r'\D', '', word)
    
    # 使用正则表达式提取所有整数
    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. 替换非数字字符

    word = re.sub(r'\D', '', word)
    

    将非数字字符替换为空字符串,避免后续处理连续空格的问题。

  2. 去除前导零并去重

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

    将每个数字转换为整数,自动去除前导零,并使用集合去重。

这样修改后,代码应该能正确处理题目要求的所有情况。