不同整数的计数问题 | 青训营X豆包MarsCode 技术训练营

87 阅读3分钟

题目解析

题目内容

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

题目解析

问题理解

题目要求我们处理一个由数字和小写英文字母组成的字符串 word。我们需要完成以下步骤:

  1. 替换非数字字符:将字符串中所有不是数字的字符替换为空格。
  2. 提取整数:从替换后的字符串中提取出所有的整数。
  3. 去除前导零:对于提取出的整数,去除其前导零。
  4. 去重:统计不同的整数的数量。

数据结构选择

  • 字符串处理:使用字符串的 join 方法和列表推导式来替换非数字字符。
  • 整数提取:使用字符串的 split 方法来提取整数。
  • 去重:使用集合(set)来存储不同的整数,因为集合会自动去重。

算法步骤

  1. 替换非数字字符

    • 遍历字符串 word,将每个非数字字符替换为空格。
    • 使用 join 方法将处理后的字符拼接成一个新的字符串。
  2. 提取整数

    • 使用 split 方法将处理后的字符串按空格分割,得到一个包含所有整数的列表。
  3. 去除前导零

    • 遍历提取出的整数列表,使用 lstrip('0') 方法去除每个整数的前导零。
    • 如果去除前导零后字符串为空,则将其视为 '0'
  4. 去重并统计

    • 将处理后的整数添加到集合中,集合会自动去重。
    • 返回集合的大小,即不同整数的数量。

总结

通过以上步骤,我们可以有效地处理字符串,提取出不同的整数,并统计它们的数量。这个算法的时间复杂度主要取决于字符串的长度,是一个线性时间复杂度的算法。

代码解析

好的,以下是一些代码提示,帮助你逐步实现这个问题的解决方案:

  1. 字符串处理:首先,你需要遍历字符串 word,将所有非数字字符替换为空格。

  2. 提取整数:接下来,你需要从处理后的字符串中提取出所有的整数。注意,提取出的整数可能包含前导零,需要去除这些前导零。

  3. 去重:使用集合(set)来存储不同的整数,这样可以自动去重。

  4. 返回结果:最后,返回集合的大小,即不同整数的数量。

以下是代码框架,其中关键步骤用注释标出:

def solution(word: str) -> int:
    # 1. 将所有非数字字符替换为空格
    word = ''.join(' ' if not char.isdigit() else char for char in word)
    
    # 2. 提取整数并去除前导零
    integers = set()
    for num in word.split():
        # 去除前导零
        num = num.lstrip('0')
        # 如果去除前导零后为空字符串,则视为0
        if num == '':
            num = '0'
        integers.add(num)
    
    # 3. 返回不同整数的数量
    return len(integers)

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

你可以根据这个框架逐步实现代码,这个题目考察了对字符串的处理,比较巧妙的是利用集合的特性进行数字去重,豆包AI提示的这种方法很大程度上降低了自己动手造轮子的复杂度,具有借鉴意义。