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

79 阅读3分钟

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

不同整数的计数问题 - MarsCode

简单的利用一下map,注意前导零的处理(事实上库函数自动处理了),没有什么难度

摘要

本文介绍了如何从给定字符串中提取出所有的数字子串,去除重复的数字(去除前导零后),并统计不同整数的个数。该问题通过遍历字符串并利用集合来存储不同的整数,最终输出唯一整数的数量。算法实现详细包括了Go和Python的代码实现。

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R希望通过将每一个非数字字符替换为空格,来分割出字符串中的整数部分。然后,他希望统计去除前导零后的不同整数的个数。

示例

  • 输入:word = "a123bc34d8ef34"
    输出:3
    解释:替换后字符串为 " 123 34 8 34",其中不同整数为 123348,共有三个不同的整数。

  • 输入:word = "t1234c23456"
    输出:2
    解释:替换后字符串为 "1234 23456",其中不同整数为 123423456,共有两个不同的整数。

  • 输入:word = "a1b01c001d4"
    输出:2
    解释:替换后字符串为 "1 01 001 4",其中不同整数为 1401001 被视为相同的数字),共有两个不同的整数。

原理分析

1. 数字提取

对于每个字符,如果它是数字,则构建一个数字子串,直到遇到非数字字符为止。我们使用 strings.Builder(在Go语言中)或一个临时列表(在Python中)来构建这个子串。

2. 去除前导零

在构建数字子串后,我们通过转换为整数来自动去除前导零。在Go语言中,可以使用 strconv.Atoi 来将字符串转换为整数,Python中使用 int() 来实现。

3. 存储唯一数字

我们使用集合(在Go中是一个map,在Python中是一个set)来存储已经遇到的不同整数。集合会自动去除重复值。

4. 结果返回

遍历完整个字符串后,集合中存储的元素即为不同整数的数量,最终返回集合的大小。

代码实现

Go语言代码

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func solution(word string) int {
    // 使用map存储唯一的整数
    cntMap := map[int]struct{}{}
    for i := 0; i < len(word); i++ {
        if word[i] >= '0' && word[i] <= '9' {
            var builder strings.Builder
            for ; i < len(word) && word[i] >= '0' && word[i] <= '9'; i++ {
                builder.WriteByte(word[i])
            }
            num, _ := strconv.Atoi(builder.String()) // 转换为整数,自动去除前导零
            cntMap[num] = struct{}{}                 // 存储整数
        }
    }
    return len(cntMap) // 返回唯一数字的个数
}

func main() {
    fmt.Println(solution("a123bc34d8ef34") == 3)  // 应输出 true
    fmt.Println(solution("t1234c23456") == 2)      // 应输出 true
    fmt.Println(solution("a1b01c001d4") == 2)      // 应输出 true
}

Python代码

def solution(word: str) -> int:
    """
    该函数接收一个字符串 word,提取其中的数字子串,去除重复值后,返回唯一数字的个数。
    """
    # 使用集合来存储唯一的数字
    unique_numbers = set()
    i = 0

    while i < len(word):
        # 检查字符是否是数字
        if word[i].isdigit():
            # 开始读取连续的数字
            num_str = []
            while i < len(word) and word[i].isdigit():
                num_str.append(word[i])
                i += 1
            # 将数字字符串转换为整数并添加到集合中
            num = int("".join(num_str))
            unique_numbers.add(num)
        else:
            # 如果当前字符不是数字,继续遍历下一个字符
            i += 1

    # 返回唯一数字的个数
    return len(unique_numbers)


if __name__ == "__main__":
    # 测试用例
    print(solution("a123bc34d8ef34") == 3)  # 应输出 True
    print(solution("t1234c23456") == 2)  # 应输出 True
    print(solution("a1b01c001d4") == 2)  # 应输出 True