不同整数的计数问题

66 阅读2分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

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

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。

题目理解

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

数据结构选择

为了高效地存储和统计不同的整数,我们可以使用集合(set)。集合的一个主要特性是它可以自动去重,这对于统计不同整数的数目非常有帮助。

算法步骤

  1. 遍历字符串:逐个字符遍历输入的字符串 word
  2. 提取数字:当遇到数字时,继续读取直到遇到非数字字符,形成一个完整的数字子串。
  3. 去除前导零:对于提取出的数字子串,去除前导零。如果去除前导零后字符串为空,则将其视为 "0"
  4. 存储不同的数字:将去除前导零后的数字子串加入集合中。
  5. 返回结果:最后,返回集合的大小,即不同整数的数目。

`代码: def solution(word: str) -> int: # 用于存储不同的整数 unique_numbers = set()

# 遍历字符串
i = 0
while i < len(word):
    # 如果当前字符是数字
    if word[i].isdigit():
        # 找到完整的数字子串
        num_start = i
        while i < len(word) and word[i].isdigit():
            i += 1
        num_str = word[num_start:i]
        
        # 去除前导零
        num_str = num_str.lstrip('0')
        if num_str == '':
            num_str = '0'
        
        # 将去除前导零后的数字加入集合
        unique_numbers.add(num_str)
    else:
        i += 1

# 返回集合的大小,即不同整数的数目
return len(unique_numbers)

if name == 'main': print(solution("a123bc34d8ef34") == 3) print(solution("t1234c23456") == 2) print(solution("a1b01c001d4") == 2)`