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

47 阅读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. 初始化变量

    • l = 0:用于记录一个整数在原字符串 word 中的起始位置。
    • nums = []:创建一个空列表,用于存储从原字符串中提取出来的整数字符串。
  2. 遍历字符串 word 以提取整数字符串

    • 通过一个循环 for r in range(1, len(word)): 从字符串的第二个字符开始遍历到最后一个字符。这里使用 r 作为当前遍历到的字符的索引。
    • 当满足 word[r] in '1234567890' and word[r - 1] not in '1234567890' 条件时,意味着当前字符 r 是数字且它前面的字符不是数字,那么就将当前数字字符的位置 r 赋值给 l,以此确定一个可能的整数的起始位置。
    • 当满足 word[r] not in '1234567890' and word[r - 1] in '1234567890' 条件时,意味着当前字符 r 不是数字但它前面的字符是数字,此时就将从起始位置 l 到当前位置 r 之前的这一段字符串(即一个完整的整数字符串)添加到 nums 列表中。
  3. 处理字符串末尾是数字的情况

    • 通过 if word[-1] in '1234567890': 判断字符串的最后一个字符是否为数字。如果是数字,就将从之前记录的起始位置 l 到字符串末尾的这一段字符串(也是一个可能的整数字符串)添加到 nums 列表中。
  4. 统计不同整数的数目

    • 首先,通过列表推导式 [int(i) for i in nums] 将 nums 列表中的每个整数字符串转换为对应的整数类型。
    • 然后,使用 set() 函数将这些整数转换为集合,集合的特性是会自动去除重复元素。所以 len(set([int(i) for i in nums])) 就能够得到不同整数的数目,也就是最终要返回的结果。

实现代码

def solution(word: str) -> int:

    l = 0

    nums = []

    for r in range(1, len(word)):

        if word[r] in '1234567890' and word[r - 1] not in '1234567890':

            l = r

        if word[r] not in '1234567890' and word[r - 1] in '1234567890':

            nums.append(word[l:r])

    if word[-1] in '1234567890':

        nums.append(word[l:])

    return len(set([int(i) for i in nums]))