2025-04-20:数字小镇中的捣蛋鬼。用go语言,数字小镇 Digitville 有一个包含 0 到 n-1 的整数列表 n

举报
福大大架构师每日一题 发表于 2025/04/20 12:47:52 2025/04/20
【摘要】 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。


分步骤描述整体过程

  1. 初始化统计结构

    • 创建一个空的映射(哈希表),用于统计数字出现的次数。
    • 结构的键是数字,值是该数字在 nums 中出现的次数。
  2. 遍历数字列表

    • 从头到尾遍历输入列表 nums
    • 对于当前数字 num,查询映射中该数字的出现计数。
    • 如果该数字之前未出现过,则在映射中加入该数字,计数置为1。
    • 如果已出现过,则计数加1。
  3. 筛选重复数字

    • 遍历映射中的所有键值对(数字及其计数)。
    • 对于计数大于或等于2(意味着数字出现了至少两次)的数字,将其加入结果列表中。
    • 最终,列表长度应为2,因为题目保证只有两个数字重复。
  4. 返回结果

    • 返回包含两个重复数字的列表。
    • 不限制结果中数字的顺序。

总结时间复杂度和空间复杂度

  • 时间复杂度

    • 遍历输入列表一遍,时间复杂度是 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。