题解:统计字符串中不同整数的数量

89 阅读3分钟

题解:统计字符串中不同整数的数量

问题描述

小R有一个字符串 word,由数字和小写英文字母组成。他希望统计在字符串中出现的不同整数的数量。在统计之前,需要按照以下规则处理字符串:

  1. 用空格替换掉所有的非数字字符。
  2. 提取出字符串中连续的数字作为整数。
  3. 如果两个整数的不含前导零的十进制表示相同,则认为它们是相同的整数。

例如:

  • 给定字符串 "a123bc34d8ef34",处理后得到整数序列:12334834,去重后有 3 个不同的整数:123348
  • 字符串 "a1b01c001d4" 中,整数序列为:1010014。由于 010011 的十进制表示相同,因此只有两个不同整数:14

解题思路

  1. 字符串处理

    • 遍历字符串,将所有非数字字符替换为空格,方便分割出连续数字部分。
  2. 提取整数

    • 使用字符串分割方法(split())将处理后的字符串分割为一个列表,提取其中的数字子串。
  3. 去除前导零

    • 将每个数字子串转换为整数类型(int),自然会去除前导零。
  4. 去重统计

    • 使用集合(set)存储所有的整数,集合的特性会自动去重。
  5. 返回结果

    • 返回集合中元素的数量,即不同整数的数量。

代码实现

以下是基于上述思路的 Python 实现:

def solution(word: str) -> int:
    # 1. 替换非数字字符为空格
    processed = ''.join(' ' if not char.isdigit() else char for char in word)
    
    # 2. 分割字符串提取所有数字子串
    numbers = processed.split()
    
    # 3. 转换为整数集合,自动去除前导零和重复项
    unique_numbers = set(int(num) for num in numbers)
    
    # 4. 返回集合大小
    return len(unique_numbers)

# 测试样例
if __name__ == '__main__':
    assert solution("a123bc34d8ef34") == 3
    assert solution("t1234c23456") == 2
    assert solution("a1b01c001d4") == 2
    assert solution("abc") == 0
    assert solution("0000") == 1

测试样例

  • 样例1

    solution("a123bc34d8ef34")
    
    • 处理步骤

      1. 替换非数字字符后:" 123 34 8 34"
      2. 提取数字子串:["123", "34", "8", "34"]
      3. 去除前导零并去重:{123, 34, 8}
    • 输出3

  • 样例2

    solution("t1234c23456")
    
    • 处理步骤

      1. 替换非数字字符后:" 1234 23456"
      2. 提取数字子串:["1234", "23456"]
      3. 去除前导零并去重:{1234, 23456}
    • 输出2

  • 样例3

    solution("a1b01c001d4")
    
    • 处理步骤

      1. 替换非数字字符后:" 1 01 001 4"
      2. 提取数字子串:["1", "01", "001", "4"]
      3. 去除前导零并去重:{1, 4}
    • 输出2


总结

  1. 高效去重:使用集合来去重,简化了逻辑,实现了对不同整数的快速统计。

  2. 前导零处理:通过转换为整数类型(int),自然去除前导零,避免了手动处理。

  3. 复杂度分析

    • 时间复杂度:O(n)O(n),其中 nn 是字符串的长度(处理替换和分割操作);
    • 空间复杂度:O(k)O(k),其中 kk 是提取出的数字子串数量。
  4. 适用性:代码简洁、逻辑清晰,适用于各种包含数字和字符的字符串。