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

50 阅读3分钟

问题描述

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

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

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


测试样例

样例1:

输入:word = "a123bc34d8ef34"
输出:3

样例2:

输入:word = "t1234c23456"
输出:2

样例3:

输入:word = "a1b01c001d4"
输出:2

问题分析

小R需要通过字符串处理,找出其中以非数字字符分隔的不同整数。需要注意以下几点:

  1. 非数字字符需要被替换为空格;
  2. 数字前的前导零需要被忽略;
  3. 返回的结果是所有不同整数的数目。

解题思路

  1. 字符串替换:将字符串中非数字字符替换为空格。
  2. 分割与提取整数:使用空格分割字符串提取可能的数字部分。
  3. 去除前导零并去重:将所有数字部分转为整数(去除前导零后自动去重)。
  4. 统计不同整数:统计集合中不同整数的个数。

算法步骤

  1. 遍历字符串,将非数字字符替换为空格。
  2. 使用字符串分割方法,提取所有数字子串。
  3. 将数字子串转换为整数,并存入集合以去重。
  4. 返回集合的大小。

代码实现

以下是Python的代码实现:

def solution(word: str) -> int:
    # Step 1: 替换非数字字符为空格
    for char in word:
        if not char.isdigit():
            word = word.replace(char, ' ')
    
    # Step 2: 分割字符串并提取整数子串
    numbers = word.split()
    
    # Step 3: 去除前导零并使用集合去重
    unique_integers = {int(num) for num in numbers}
    
    # Step 4: 返回集合的大小
    return len(unique_integers)

# 测试样例
print(solution("a123bc34d8ef34"))  # 输出: 3
print(solution("t1234c23456"))      # 输出: 2
print(solution("a1b01c001d4"))      # 输出: 2

优化分析

  1. 字符串替换优化
    • 替换使用str.translate()str.maketrans()可提高性能。
  2. 集合操作
    • 使用集合直接初始化数字列表,避免额外存储。

优化代码如下:

def solution(word: str) -> int:
    # 使用 translate 和 maketrans 提高效率
    table = str.maketrans({chr(i): ' ' for i in range(256) if not chr(i).isdigit()})
    word = word.translate(table)
    
    # 提取整数并去重
    unique_integers = {int(num) for num in word.split()}
    
    # 返回不同整数的个数
    return len(unique_integers)

# 测试样例
print(solution("a123bc34d8ef34"))  # 输出: 3
print(solution("t1234c23456"))      # 输出: 2
print(solution("a1b01c001d4"))      # 输出: 2

时间与空间复杂度分析

  1. 时间复杂度
    • 替换字符:O(n)O(n),其中 nn 是字符串的长度。
    • 分割字符串:O(m)O(m),mm 为分割后子串的总长度。
    • 转换为整数:O(k)O(k),kk 为数字子串的数量。
    • 综合复杂度为 O(n+m+k)O(n + m + k),实际接近于 O(n)O(n)。
  2. 空间复杂度
    • 使用集合存储不同整数,最坏情况下空间复杂度为 O(k)O(k),kk 为整数数量。