青训营X豆包MarsCode 不同整数的计数问题

62 阅读3分钟

题目

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

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

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

解题思路

1. 过滤出数字

首先,我们需要从字符串中提取出所有的数字部分。非数字字符(字母和符号)应该被替换为空格,这样我们可以清楚地得到由数字构成的子字符串。

2. 去除前导零

对于每一个数字字符串,我们需要去除可能存在的前导零。比如 "00123" 和 "123" 应该视为相同的整数。所以在提取数字字符串时,我们需要确保每个数字字符串是不包含前导零的。

3. 统计不同的整数

一旦提取出所有的数字部分并去除前导零后,我们就可以将它们存储在一个集合中。集合会自动去除重复元素,因此最终集合的大小就是我们需要的答案——不同整数的数目。

豆包MarsCode AI给出的完善后的步骤详解

  1. 替换非数字字符为空格

    使用 Python 中的正则表达式(re 模块)来替换非数字字符为空格。或者,简单的方法是逐字符遍历字符串,遇到字母就替换为空格,遇到数字就保留。

  2. 提取数字子串

通过拆分字符串,将数字部分提取出来。拆分时,空格会成为分隔符。

  1. 去除前导零

对于每个数字子串,使用 Python 内建的 int() 函数将字符串转换为整数。int() 会自动去除前导零。如果该数字字符串全是零,int("000") 会变为 0

  1. 去重统计

将每个转换后的整数加入一个集合中。集合会自动去除重复元素,因此最终集合的大小就是我们需要的答案。

代码实现

python
 代码解读
复制代码

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


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

时间复杂度分析

  • 正则表达式匹配:会遍历整个字符串,时间复杂度为 O(n),其中 n 是字符串的长度。

  • 去重和整数转换:我们需要遍历所有提取出的数字子串,并将每个数字转换为整数,这一过程的时间复杂度为 O(m),其中 m 是提取出的数字子串的数量。

  • 因此,整体时间复杂度是 O(n),其中 n 是输入字符串的长度。