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

51 阅读2分钟

问题

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

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

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

要解决这个问题,主要分为以下几个步骤:

  1. 替换字符:首先,遍历字符串,将每个非数字字符替换为空格。
  2. 分割字符串:用空格分割字符串,得到数字的部分。
  3. 去重和去前导零:去除前导零后,统计唯一的数字字符串。

具体实现步骤:

  • 遍历字符串,如果是数字就保留,否则替换为空格。
  • 分割字符串,以空格为分隔符,得到所有数字部分。
  • 去除前导零:每个数字字符串需要去掉前导零,可以通过 str.lstrip('0') 来实现。
  • 去重:将去掉前导零后的数字存入一个集合(set),自动去重。

完整代码实现:

def solution(word: str) -> int:
    # 替换非数字字符为空格
    transformed = ''.join(c if c.isdigit() else ' ' for c in word)
    
    # 按空格分割字符串,得到所有的数字部分
    numbers = transformed.split()
    
    # 去除前导零后,存入集合去重
    unique_numbers = set(str(int(num)) for num in numbers)
    
    # 返回不同整数的数目
    return len(unique_numbers)

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

代码解析:

  1. 替换非数字字符''.join(c if c.isdigit() else ' ' for c in word) 遍历每个字符,如果是数字,则保留字符,否则替换为空格。
  2. 分割字符串transformed.split() 根据空格将字符串分割成多个数字字符串。
  3. 去除前导零并去重:通过 int(num) 去掉数字字符串中的前导零(整数会自动去掉前导零),然后转回字符串存入集合 unique_numbers
  4. 返回结果:集合中的元素是唯一的,最终通过 len() 返回集合的大小,表示不同整数的数目。

运行结果:

  • 对于输入 "a123bc34d8ef34",会输出 3
  • 对于输入 "t1234c23456",会输出 2
  • 对于输入 "a1b01c001d4",会输出 2