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

119 阅读3分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数

问题理解

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

解题思路

  1. 字符串处理

    • 遍历字符串 word,将非数字字符替换为空格。
    • 使用正则表达式或字符串操作来提取出所有数字子串。
  2. 整数提取

    • 提取出的数字子串可能包含前导零,需要去除前导零。
    • 使用集合(set)来存储不同的整数,因为集合会自动去重。
  3. 统计不同整数

    • 将处理后的整数添加到集合中。
    • 集合的大小即为不同整数的数目。

数据结构选择

  • 集合(set :用于存储不同的整数,自动去重。

算法步骤

  1. 使用正则表达式或字符串操作将非数字字符替换为空格。
  2. 提取出所有数字子串。
  3. 去除每个数字子串的前导零。
  4. 将处理后的整数添加到集合中。
  5. 返回集合的大小。

代码

import re

def solution(word: str) -> int:
    # 提取所有数字子串
    digits = re.findall(r'\d+', word)
    
    # 创建一个集合来存储不同的整数
    unique_integers = set()
    
    # 遍历所有提取出的数字子串
    for digit in digits:
        # 将数字子串转换为整数并添加到集合中
        unique_integers.add(int(digit))
    
    # 返回集合的大小
    return len(unique_integers)

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

代码解析

  1. 使用正则表达式提取数字子串,我们可以使用 re.findall() 函数来提取字符串中所有符合正则表达式的子串。对于数字子串,我们可以使用正则表达式 \d+,它表示一个或多个数字
  2. 使用 int() 函数去除前导零int() 函数可以将字符串转换为整数,并且在转换过程中会自动去除前导零。例如,int("00123") 会返回 123
  3. 将数字子串转换为整数并添加到集合中,我们可以遍历提取出的数字子串,使用 int() 函数将其转换为整数,并添加到集合中。集合会自动去重,因此我们最终得到的集合大小就是不同整数的数目。

感悟