不同整数的计数问题 | 豆包MarsCode AI刷题
简单的利用一下map,注意前导零的处理(事实上库函数自动处理了),没有什么难度
摘要
本文介绍了如何从给定字符串中提取出所有的数字子串,去除重复的数字(去除前导零后),并统计不同整数的个数。该问题通过遍历字符串并利用集合来存储不同的整数,最终输出唯一整数的数量。算法实现详细包括了Go和Python的代码实现。
问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R希望通过将每一个非数字字符替换为空格,来分割出字符串中的整数部分。然后,他希望统计去除前导零后的不同整数的个数。
示例
-
输入:
word = "a123bc34d8ef34"
输出:3
解释:替换后字符串为" 123 34 8 34",其中不同整数为123、34和8,共有三个不同的整数。 -
输入:
word = "t1234c23456"
输出:2
解释:替换后字符串为"1234 23456",其中不同整数为1234和23456,共有两个不同的整数。 -
输入:
word = "a1b01c001d4"
输出:2
解释:替换后字符串为"1 01 001 4",其中不同整数为1和4(01和001被视为相同的数字),共有两个不同的整数。
原理分析
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