首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >可视化图解算法69:数组中只出现一次的两个数字

可视化图解算法69:数组中只出现一次的两个数字

原创
作者头像
用户11589437
修改2025-11-22 10:05:04
修改2025-11-22 10:05:04
410
举报

1.题目

描述

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 2≤n≤1000,数组中每个数的大小 0 <val≤1000000 要求:空间复杂度 O(1),时间复杂度 O(n)

提示:输出时按非降序排列。

示例1

输入:

[1,4,1,6]

返回值:

[4,6]

说明:

返回的结果中较小的数排在前面

示例2

输入:

[1,2,3,3,2,9]

返回值:

[1,9]

2. 题解思路

本题还是统计次数,因此可以通过map完成。但根据题目:数组里除了两个数字只出现一次,其他的数字都出现了两次,这时就可通过一个set来代替map来实现。

具体思路是:

  1. 定义一个哈希表(set);
  2. 遍历数组元素,如果该元素在哈希表中存在,则直接删除;不存在则添加到哈希表中;
  3. 哈希表中只有2个元素,全部取出,放到结果集中;
  4. 进行非降序排序。

注:用set而非map,主要优势是:set中最终只有2个数字,占用存储空间小(如有要用map,需要存储多个key-value键值对数据)。

如果文字描述的不太清楚,你可以参考视频的详细讲解:B站@好易学数据结构

3.编码实现

核心代码如下:

代码语言:go
复制
func FindNumsAppearOnce(nums []int) []int {
    res := make([]int, 0, 2)
    // 1.定义一个哈希表(set),用map实现set的功能
    hashTable := make(map[int]struct{})
    //2.遍历数组元素,如果该元素在哈希表中存在,则直接删除;不存在则添加到哈希表中
    for _, v := range nums {
        if _, ok := hashTable[v]; ok {
            delete(hashTable, v)
        } else {
            hashTable[v] = struct{}{}
        }
    }
    //3.哈希表中只有2个元素,全部取出,放到结果集中
    for key, _ := range hashTable {
        res = append(res, key)
    }
    //4.进行非降序排序
    if res[0] > res[1] {
        res[0], res[1] = res[1], res[0]
    }
    return res
}
​

具体完整代码你可以参考下面视频的详细讲解。

4.总结

本题首先想到的是通过map来实现,难点是如果想到通过set来对map实现方法进行改进。通过set,可以将数组出现两次的元素过滤掉(出现第一次,添加到set中;出现第二次,到set中删除元素)。最终set中只剩余2个只出现一次的元素。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

✅ 链表

✅ 二叉树

✅ 二分查找、排序

✅ 堆、栈、队列

✅ 回溯算法

✅ 哈希算法

✅ 动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:富与贵,是人之所欲也;不以其道得之,不处也。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.题目
    • 2. 题解思路
    • 3.编码实现
    • 4.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档