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

56 阅读5分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写字母组成。小R希望将每个非数字字符替换为空格,并统计替换后剩下的整数中不同整数的数目。

例如:

给定字符串 "a123bc34d8ef34",替换后的字符串为 " 123 34 8 34"。其中,不同的整数有 "123""34""8",因此不同整数的数量是 3

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


思路解析

1. 输入格式和要求

  • 输入: 一个字符串 word,包含数字和小写字母。
  • 输出: 统计替换后的字符串中的不同整数的个数。

2. 关键操作

  • 替换操作: 将所有非数字字符替换为空格。
  • 提取整数: 利用正则表达式从字符串中提取所有的整数。
  • 去重操作: 使用集合(set)去重,确保统计的整数是唯一的。

3. 解决步骤

  1. 替换非数字字符:
    • 对字符串中的每个字符进行判断,将非数字字符替换为空格。
  2. 提取整数:
    • 使用正则表达式 \b\d+\b 提取字符串中的整数部分。\b 表示单词边界,\d+ 表示一个或多个数字字符。
  3. 去重并统计:
    • 将提取出的整数转换为整型并存入集合中,集合自动去重。
    • 最后,返回集合的大小,即不同整数的数量。

4. 关键点

  • 前导零处理: 例如 011 是相同的整数,因此在提取时应该忽略前导零。
  • 整数不重复计数: 将整数转换为 int 类型,可以去掉前导零并正确比较不同整数。

代码实现

import re

def solution(word: str) -> int:
    # Step 1: Replace non-digit characters with spaces
    word = ''.join(' ' if not char.isdigit() else char for char in word)
    
    # Step 2: Extract all integers using regex
    # 使用正则表达式提取所有整数,并确保不含前导零
    integers = re.findall(r'\b\d+\b', word)
    
    # Step 3: Use a set to store unique integers
    unique_integers = set(int(num) for num in integers)
    
    # Step 4: Return the count of unique integers
    return len(unique_integers)


if __name__ == '__main__':
    # 测试用例
    print(solution("a123bc34d8ef34") == 3)  # 测试样例1
    print(solution("t1234c23456") == 2)  # 测试样例2
    print(solution("a1b01c001d4") == 2)  # 测试样例3

    print(solution("a123bc34d8ef34"))  # 输出3



代码解释

Step 1: 替换非数字字符

word = ''.join(' ' if not char.isdigit() else char for char in word)
  • 使用列表推导式遍历字符串中的每个字符,判断是否是数字字符。如果是数字字符,则保留该字符,否则将其替换为空格。最终通过 join() 方法将这些字符连接成新的字符串。

Step 2: 提取整数

integers = re.findall(r'\b\d+\b', word)
  • 使用正则表达式 \b\d+\b 提取整数。\b 确保我们提取的是单独的整数,而不是被字母连接的数字。\d+匹配一个或多个连续的数字字符。

Step 3: 去重并转换为整数

unique_integers = set(int(num) for num in integers)
  • 使用集合(set)存储提取出的整数,集合的特性是自动去重。通过 int(num) 将每个数字字符串转换为整数,确保去除前导零。

Step 4: 返回不同整数的数量

return len(unique_integers)
  • 返回集合的大小,即不同整数的数量。

测试用例分析

测试用例1

输入:
word = "a123bc34d8ef34"

步骤:

  • 替换非数字字符后得到字符串:" 123 34 8 34"
  • 提取整数:["123", "34", "8", "34"]
  • 去重后的整数:{"123", "34", "8"}
  • 最终输出:3

输出:  3


测试用例2

输入:
word = "t1234c23456"

步骤:

  • 替换非数字字符后得到字符串:" 1234 23456"
  • 提取整数:["1234", "23456"]
  • 去重后的整数:{"1234", "23456"}
  • 最终输出:2

输出:  2


测试用例3

输入:
word = "a1b01c001d4"

步骤:

  • 替换非数字字符后得到字符串:" 1 01 001 4"
  • 提取整数:["1", "01", "001", "4"]
  • 去重后的整数:{"1", "4"}(注意 01 和 001 被视为 1)。
  • 最终输出:2

输出:  2

总结与学习建议

总结

  1. 字符串处理与正则表达式:
    通过使用正则表达式有效地提取数字部分,并且利用集合去重来保证结果的准确性。
  2. 前导零处理:
    使用 int 类型转换自动去除前导零,避免了手动处理。
  3. 空间与时间效率:
    代码实现高效,利用集合去重和正则表达式提取数字的方式,使得问题得以迅速解决。

学习建议

  1. 深入理解正则表达式:
    正则表达式是处理字符串匹配和提取的强大工具,掌握常见的正则表达式模式对于字符串处理问题非常有帮助。
  2. 集合与去重:
    集合是解决去重问题的高效工具,理解集合的特性,能够帮助我们解决许多实际问题。
  3. 边界情况的处理:
    在处理数字和字符串时,特别要注意边界条件,比如前导零等特殊情况。
  4. 加强算法分析能力:
    在处理类似问题时,考虑到时间和空间复杂度,优化算法是提高解决效率的关键。