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

101 阅读3分钟

题目:

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。

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

解题思路:

  1. 字符串处理:我们需要遍历字符串 word,并将所有非数字字符替换为空格。
  2. 提取整数:将替换后的字符串按空格分割,提取出所有的整数。
  3. 去除前导零:将每个整数转换为整型(int),这样可以自动去除前导零。
  4. 去重:使用集合来存储这些整数,以确保我们只统计不同的整数。
  5. 返回结果:返回集合的大小,即不同整数的数目。

详细步骤:

1.替换非数字字符:

遍历字符串中的每个字符。如果字符是数字,保留它;否则,将其替换为空格。使用 ''.join() 方法将处理后的字符拼接成一个新的字符串。

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

2.提取整数:

使用 split() 方法将处理后的字符串按空格分割,得到一个包含所有整数的列表。

numbers = word.split()

3.去除前导零并去重:

使用集合来存储整数,自动去重。将每个整数转换为整型(int),这样可以自动去除前导零。

unique_numbers = set(int(num) for num in numbers)

4.返回结果:

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

return len(unique_numbers)

具体代码:

def solution(word: str) -> int:
    # 1. 将所有非数字字符替换为空格
    word = ''.join(' ' if not char.isdigit() else char for char in word)
    
    # 2. 按空格分割字符串,提取出所有的整数
    numbers = word.split()
    
    # 3. 将每个整数转换为整型,去除前导零,并使用集合来存储不同的整数
    unique_numbers = set(int(num) for num in numbers)
    
    # 4. 返回集合的大小,即不同整数的数目
    return len(unique_numbers)

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

知识点

1. 字符串处理
  • 使用 for 循环遍历字符串中的每个字符。使用 isdigit() 方法判断字符是否为数字。 使用 ''.join() 方法将处理后的字符拼接成一个新的字符串。
2. 列表操作
  • 使用列表推导式简化代码,生成新的列表。使用 split() 方法将字符串按空格分割,得到一个包含所有整数的列表。
3. 集合操作
  • 使用集合(set)来存储整数,这可以实现自动去重。使用 len() 方法获取集合的大小,即不同整数的数目。
4. 类型转换
  • 使用 int() 方法将字符串转换为整数,自动去除前导零。