学习方法与心得4——不同整数的计数问题 | 豆包MarsCode AI刷题

32 阅读3分钟

问题描述

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

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

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

代码实现

def solution(word: str) -> int:
    import re
    # 替换所有非数字字符为空格
    replaced = re.sub(r'[^\d]', ' ', word)
    # 分割字符串,提取所有的数字部分
    numbers = replaced.split()
    # 去掉前导零并将它们转换为集合以找到不同的整数
    unique_numbers = {int(num) for num in numbers}
    # 返回集合的长度
    return len(unique_numbers)

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

一、题目解析

本题要求统计一个字符串中不同整数的数量。字符串包含字母和数字,通过以下步骤可以解决问题:

1、解题思路
  • 替换非数字字符:将字符串中所有非数字字符替换为空格。这样可以提取出连续的数字块。
  • 分割提取数字:使用字符串的 split() 方法将数字块分割出来,得到所有数字的列表。
  • 去掉前导零并去重:将数字转换为整数以去掉前导零,并使用集合存储这些数字,集合天然去重。
  • 统计集合大小:最后,集合的长度即为不同整数的个数。
2、示例分析

输入1:"a123bc34d8ef34"

  • 替换后:" 123 34 8 34"
  • 提取数字:["123", "34", "8", "34"]
  • 去掉前导零并去重:{123, 34, 8}
  • 集合长度:3

输入2:"a1b01c001d4"

  • 替换后:" 1 01 001 4"
  • 提取数字:["1", "01", "001", "4"]
  • 去掉前导零并去重:{1, 4}
  • 集合长度:2

二、知识总结

1、正则表达式的使用

  • re.sub(r'[^\d]', ' ', word):将字符串中非数字字符替换为空格。
  • 学习正则表达式的常见操作,如替换 (sub)、匹配 (match) 和提取 (findall)。

2、集合的去重特性

  • 利用 Python 的集合 set 数据结构,可以快速去重。
  • 在处理数字时,使用 int 转换可以自动去掉前导零。

3、字符串处理方法

  • split() 方法将字符串按空格分割,是提取连续数字块的关键。

三、学习建议

对于入门学习者,掌握正则表达式和字符串操作是基础。建议通过多个练习熟悉 re 模块和集合操作,逐步提高对数据清理问题的解决能力。

总结建议

通过将 AI 刷题功能与传统学习资源结合,可以快速理解基础知识,同时通过复盘和优化不断提高代码能力。在学习过程中,注重知识的融会贯通,逐步掌握更多高效解题技巧。