青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

68 阅读5分钟

题目:不同整数的计数问题

问题描述

小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

题目解析

这道题的核心是字符串处理和去重。我们要做的就是:

  1. 替换非数字字符为空格:在字符串中,将所有字母和非数字字符替换为空格。这样做的目的是为了方便后续提取出纯数字的子串。
  2. 提取数字串:通过 split() 方法,根据空格将字符串分割成数字串。每个数字串都代表一个潜在的整数。
  3. 去除前导零:在提取出来的数字串中,必须去除前导零,因为两个数字字符串如 "001" 和 "1" 应该视为相同。
  4. 去重:通过集合 set() 来去重,保证统计不同的整数数量。
  5. 统计不同整数的个数:最终返回集合的长度,即为不同整数的数量。

思路图解

假设给定的字符串是 word = "a123bc34d8ef34",我们可以按以下步骤处理:

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

    原始字符串:

    arduino
    复制代码
    "a123bc34d8ef34"
    

    替换后:

    arduino
    复制代码
    " 123 34 8 34"
    
  2. 分割字符串:通过 split() 方法,得到数字串列表:

    css
    复制代码
    ["123", "34", "8", "34"]
    
  3. 去除前导零

    • "123" -> 123
    • "34" -> 34
    • "8" -> 8
    • "34" -> 34

    去重后得到的整数是:

    复制代码
    {123, 34, 8}
    
  4. 返回不同整数的数量:集合的大小为 3,所以答案是 3。

代码详解

python
复制代码
def solution(word: str) -> int:
    # 用空格替换非数字字符
    word = ''.join(c if c.isdigit() else ' ' for c in word)
    
    # 分割出数字串
    numbers = word.split()
    
    # 去除前导零并加入集合
    unique_numbers = set(int(num) for num in numbers)
    
    # 返回去重后的不同数字的数量
    return len(unique_numbers)
  1. ''.join(c if c.isdigit() else ' ' for c in word) :这段代码将遍历字符串 word,对于每个字符,如果是数字,则保留,否则用空格替换。最终结果是一个只包含数字和空格的字符串。
  2. split() :将字符串按空格分割,得到所有的数字子串。
  3. set(int(num) for num in numbers) :对于每个分割出的数字子串,先转换为整数,去除前导零,然后通过集合去重。
  4. len(unique_numbers) :最后返回集合中不同数字的数量。

知识总结

  • 字符串处理技巧:这道题的关键是如何从字符串中提取出有效的数字,并且去除前导零。常见的字符串操作如 isdigit()split() 和集合的去重功能是常用的技能。
  • 集合的作用:集合在 Python 中有自动去重的特性,适合用来统计不同的元素数量。
  • 字符串替换技巧:使用 join() 和条件表达式来处理字符的替换,是 Python 中高效的字符串处理方法之一。

学习建议

  • 注重基本操作的熟练掌握:对于 Python 这种语言,字符串、列表、集合等基础数据结构的熟练掌握是解决大部分问题的基础。需要理解如何利用这些工具提高效率。
  • 多做题、多总结:像这道题,尽管问题本身比较简单,但在处理时需要注重细节,特别是数字的去重和去除前导零。在刷题时,需要逐步提高解决问题的准确性和高效性。

学习计划

  1. 制定刷题计划

    • 每天设定刷题目标:根据个人时间安排,设定每日刷题数量,并逐步增加难度。例如,开始时可以每天解决 2~3 道简单题,逐渐增加到难度适中的题目。
    • 多领域练习:在开始时,可以选择一个领域(如字符串处理、动态规划等),集中的刷相关题目,以加深对该领域的理解。
  2. 错题针对性学习

    • 在遇到错题时,务必对照解题思路进行分析,理解错误原因。
    • 错题本:记录错题及其正确解法,定期回顾和练习。
    • 利用 AI 系统的反馈:通过 MarsCode AI 等刷题平台,可以得到题目的详细解析和优化建议,借此不断提升解决问题的技巧。

工具运用

  • 结合 AI 刷题功能:使用 MarsCode AI 这样的刷题工具,可以加速题目的解答,并通过智能反馈对思路进行优化。
  • 结合其他学习资源:除了 AI 刷题功能,还可以通过查阅相关书籍或视频教程来加深对算法和数据结构的理解。在遇到难题时,可以结合这些资源找到更多解题思路。

通过这些工具和资源的结合使用,能够在短时间内有效提高自己的刷题效率和解题能力。