2025-04-20:数字小镇中的捣蛋鬼。用go语言,数字小镇 Digitville 有一个包含 0 到 n-1 的整数列表 n
【摘要】 2025-04-20:数字小镇中的捣蛋鬼。用go语言,数字小镇 Digitville 有一个包含 0 到 n-1 的整数列表 nums,按理来说,每个数字只会出现一次,但现在有两个数字各多出现了一次,导致列表长度超出正常值。作为小镇的侦探,你的任务是找出这两个多出的数字。请返回一个长度为 2 的数组,包含这两个数字,顺序不限。2 <= n <= 100。nums.length == n + ...
2025-04-20:数字小镇中的捣蛋鬼。用go语言,数字小镇 Digitville 有一个包含 0 到 n-1 的整数列表 nums,按理来说,每个数字只会出现一次,但现在有两个数字各多出现了一次,导致列表长度超出正常值。
作为小镇的侦探,你的任务是找出这两个多出的数字。
请返回一个长度为 2 的数组,包含这两个数字,顺序不限。
2 <= n <= 100。
nums.length == n + 2。
0 <= nums[i] < n。
输入保证 nums 中 恰好 包含两个重复的元素。
输入: nums = [7,1,5,4,3,4,6,0,9,5,8,2]。
输出: [4,5]。
解释:
数字 4 和 5 分别在数组中出现了两次。
题目来自leetcode3289。
分步骤描述整体过程
-
初始化统计结构
- 创建一个空的映射(哈希表),用于统计数字出现的次数。
- 结构的键是数字,值是该数字在
nums
中出现的次数。
-
遍历数字列表
- 从头到尾遍历输入列表
nums
。 - 对于当前数字
num
,查询映射中该数字的出现计数。 - 如果该数字之前未出现过,则在映射中加入该数字,计数置为1。
- 如果已出现过,则计数加1。
- 从头到尾遍历输入列表
-
筛选重复数字
- 遍历映射中的所有键值对(数字及其计数)。
- 对于计数大于或等于2(意味着数字出现了至少两次)的数字,将其加入结果列表中。
- 最终,列表长度应为2,因为题目保证只有两个数字重复。
-
返回结果
- 返回包含两个重复数字的列表。
- 不限制结果中数字的顺序。
总结时间复杂度和空间复杂度
-
时间复杂度:
- 遍历输入列表一遍,时间复杂度是 O(n)。
- 遍历映射(最多有 n 个不同数字)一遍,时间复杂度是 O(n)。
- 因此总时间复杂度是 O(n),其中 n 是正常情况下的数字数量,即
n
(不包括多出的两个重复数字)。
-
空间复杂度:
- 维护一个映射用来存储数字出现次数,最多存储 n 个不同键。
- 结果列表固定长度2,空间使用常数。
- 因此总的额外空间复杂度是 O(n)。
额外说明
- 该方法借助哈希表实现,能够快速统计数字出现次数,效率较高。
- 题目输入保证只有恰好两个数字重复,因此不用考虑出现次数超过2的情况。
- n 的取值范围较小(2 到 100),该方法的空间和时间资源消耗完全可接受。
Go完整代码如下:
package main
import (
"fmt"
)
func getSneakyNumbers(nums []int) []int {
countMap := make(map[int]int)
for _, num := range nums {
countMap[num]++
}
var ans []int
for num, count := range countMap {
if count >= 2 {
ans = append(ans, num)
}
}
return ans
}
func main() {
nums := []int{7, 1, 5, 4, 3, 4, 6, 0, 9, 5, 8, 2}
results := getSneakyNumbers(nums)
fmt.Println(results)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def get_sneaky_numbers(nums):
count_map = {}
for num in nums:
count_map[num] = count_map.get(num, 0) + 1
ans = []
for num, count in count_map.items():
if count >= 2:
ans.append(num)
return ans
if __name__ == "__main__":
nums = [7, 1, 5, 4, 3, 4, 6, 0, 9, 5, 8, 2]
results = get_sneaky_numbers(nums)
print(results)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)