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

81 阅读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

问题理解

我们需要处理一个由数字和小写英文字母组成的字符串,目标是统计替换非数字字符为空格后,剩下的不同整数的数量。

数据结构选择

  • 字符串处理:我们需要遍历字符串,将非数字字符替换为空格。
  • 分割字符串:将处理后的字符串按空格分割,得到所有整数。
  • 去重:使用集合(set)来存储不同的整数,因为集合会自动去重。

算法步骤

  1. 替换非数字字符:遍历字符串,将每个非数字字符替换为空格。
  2. 分割字符串:使用空格分割处理后的字符串,得到所有整数。
  3. 去重并转换为整数:将分割后的字符串转换为整数,并放入集合中。
  4. 统计不同整数的数量:集合的大小即为不同整数的数量。

关键点

  • 去除前导零:在将字符串转换为整数时,Python 会自动去除前导零。
  • 使用集合去重:集合可以自动去重,简化统计不同整数的过程。

代码框架

    # 替换非数字字符为 空格
    replaced_word = ''.join([' ' if not c.isdigit() else c for c in word])
    
    # 按空格分割字符串
    parts = replaced_word.split()
    
    # 去除前导零并放入集合
    unique_numbers = set(int(part) for part in parts)
    
    # 返回不同整数的数量
    return len(unique_numbers)

# 测试样例
test_cases = [
    "a123bc34d8ef34",
    "t1234c23456",
    "a1b01c001d4"
]

for word in test_cases:
    print(f"输入:{word}")
    print(f"输出:{solution(word)}")
    print()

关键步骤解释

  1. 替换非数字字符
replaced_word = ''.join([' ' if not c.isdigit() else c for c in word])

这行代码遍历字符串 word,将每个非数字字符替换为空格。

  1. 分割字符串
parts = replaced_word.split()

使用空格分割处理后的字符串 replaced_word,得到所有整数。

  1. 去重并转换为整数
unique_numbers = set(int(part) for part in parts)

将分割后的字符串转换为整数,并放入集合 unique_numbers 中,集合会自动去重。

  1. 统计不同整数的数量
return len(unique_numbers)

返回集合 unique_numbers 的大小,即不同整数的数量。

实现代码

    # 替换非数字字符为 空格
    replaced_word = ''.join([' ' if not c.isdigit() else c for c in word])
    
    # 按空格分割字符串
    parts = replaced_word.split()
    
    # 去除前导零并放入集合
    unique_numbers = set(int(part) for part in parts)
    
    # 返回不同整数的数量
    return len(unique_numbers)

# 测试样例
test_cases = [
    "a123bc34d8ef34",
    "t1234c23456",
    "a1b01c001d4"
]

for word in test_cases:
    print(f"输入:{word}")
    print(f"输出:{solution(word)}")
    print()

总结与反思

这道题主要考察了以下几个编程和算法相关的考点:

1. 字符串处理

  • 字符遍历与替换:通过遍历字符串,将非数字字符替换为空格。这需要对字符串的基本操作有深入的理解。
  • 字符串分割:使用空格分割字符串,得到所有整数。这涉及到字符串的分割操作。

2. 数据结构的应用

  • 集合(Set) :使用集合来存储不同的整数,集合的特性是自动去重,这简化了统计不同整数的过程。
  • 列表(List) :在分割字符串后,得到的结果是一个列表,列表的遍历和操作也是常见的考点。

3. 类型转换

  • 字符串到整数的转换:将分割后的字符串转换为整数,Python 的 int() 函数会自动去除前导零,这简化了处理过程。

4. 算法思维

  • 去重与统计:通过集合去重并统计不同整数的数量,这需要理解集合的特性以及如何利用集合来简化问题。
  • 逻辑思维:如何将问题分解为多个步骤,并逐步解决,这需要良好的逻辑思维能力。

5. 代码实现与测试

  • 函数封装:将问题封装为一个函数 solution,并通过测试样例来验证函数的正确性。
  • 测试驱动开发:通过编写测试样例来驱动代码的开发和验证,这是一种常见的开发方法。

综合考察了字符串处理、数据结构的应用、类型转换、算法思维以及代码实现与测试等多个方面的知识点。解决这个问题可以锻炼和提升编程的基本技能和算法思维能力。