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

56 阅读3分钟

问题描述

小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. 问题理解

  • 输入是一个由数字和小写英文字母组成的字符串 word
  • 目标是将字符串中的非数字字符替换为空格,然后统计替换后剩下的整数中不同的整数的数目。
  • 注意:只有当两个整数的十进制表示不同(不含前导零)时,才认为它们是不同的整数。

2. 替换非数字字符

我们遍历字符串 word,将每个非数字字符替换为空格。可以使用列表推导式来实现这一步:

word = ''.join(' ' if not char.isdigit() else char for char in word)

这行代码的作用是:

  • 遍历字符串 word 中的每个字符 char
  • 如果 char 不是数字(即 not char.isdigit() 为真),则将其替换为空格 ' '
  • 如果 char 是数字,则保持不变。
  • 最后,使用 ''.join(...) 将列表推导式的结果连接成一个新的字符串。

3. 提取整数

接下来,我们将替换后的字符串按空格分割,提取出所有的整数。可以使用 split() 方法来实现:

integers = word.split()

这行代码的作用是:

  • 将字符串 word 按空格分割成多个部分,并返回一个包含这些部分的列表 integers

4. 去重并统计

为了统计不同的整数,我们可以使用集合(set)来存储这些整数,因为集合具有自动去重的特性。然后,我们可以通过集合的大小来得到不同整数的数目:

unique_integers = set(int(num) for num in integers) 这行代码的作用是:

  • 遍历 integers 列表中的每个字符串 num
  • 将 num 转换为整数 int(num)
  • 将转换后的整数添加到集合 unique_integers 中。

最后,返回集合的大小:

return len(unique_integers)

总结

通过上述步骤,我们可以将问题分解为以下几个关键步骤:

  1. 替换非数字字符:将字符串中的非数字字符替换为空格。
  2. 提取整数:将替换后的字符串按空格分割,提取出所有的整数。
  3. 去重并统计:使用集合来存储不同的整数,并返回集合的大小。

代码实现

将上述步骤整合到一起,完整的代码实现如下:

def solution(word: str) -> int:
    # 1. 将非数字字符替换为空格
    word = ''.join(' ' if not char.isdigit() else char for char in word)
    
    # 2. 按空格分割字符串,提取整数
    integers = word.split()
    
    # 3. 使用集合去重
    unique_integers = set(int(num) for num in integers)
    
    # 4. 返回不同整数的数目
    return len(unique_integers)

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

总结

  • 替换非数字字符:使用列表推导式和 ''.join(...) 方法。
  • 提取整数:使用 split() 方法按空格分割字符串。
  • 去重并统计:使用集合 set 来存储不同的整数,并返回集合的大小。