字节跳动青训营刷题笔记5| 豆包MarsCode AI刷题

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

解题思路

  • 替换非数字字符

    • 遍历给定的字符串,将其中所有的非数字字符替换为空格。这样,我们就能够用空格分隔出所有数字部分。
    • 例如,对于字符串 "a123bc34d8ef34",替换后得到 " 123 34 8 34"
  • 提取数字部分

    • 将替换后的字符串按空格进行分割,得到多个数字字符串。这样做可以将所有数字部分提取出来。
    • 例如,分割 " 123 34 8 34" 得到列表 ['123', '34', '8', '34']
  • 去除前导零

    • 对每个提取出的数字字符串,转换成整数。整数类型自动去除前导零,因此,'001''01''1' 都会被视为同一个整数 1
    • 例如,数字 '01' 会被转换成整数 1
  • 去重

    • 将去除前导零后的数字存入一个集合。集合的特性是自动去除重复的元素,因此只会保留不同的整数。
    • 例如,数字 ['123', '34', '8', '34'] 转换成整数后,集合将是 {123, 34, 8},去除了重复的 34
  • 返回不同整数的数量

    • 最后,返回集合的大小,即不同整数的数量。
    • 例如,集合 {123, 34, 8} 的大小为 3,表示有 3 个不同的整数。

步骤总结

  1. 遍历字符串,将非数字字符替换为空格。
  2. 分割字符串,提取出每个数字字符串。
  3. 转换为整数,去除数字字符串的前导零。
  4. 存入集合,确保每个整数只出现一次。
  5. 返回集合的大小,即不同整数的数量。

代码

def solution(word: str) -> int:
    # 替换非数字字符为空格
    modified_word = ''.join(c if c.isdigit() else ' ' for c in word)
    
    # 分割字符串,提取数字
    numbers = modified_word.split()
    
    # 用集合存储去重后的整数
    unique_numbers = set(int(num) for num in numbers)
    
    # 返回集合的大小,即不同整数的数量
    return len(unique_numbers)

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

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。我们需要遍历每个字符,替换非数字字符并进行分割和处理。
  • 空间复杂度:O(k),其中 k 是数字部分的个数。我们需要一个集合来存储去重后的整数。