【LeetCode: 260. 只出现一次的数字 III | 位运算 | 哈希表】

本文围绕LeetCode 260题“只出现一次的数字 III”展开,题目要求在整数数组中找出仅出现一次的两个元素。介绍了两种求解思路,一是用哈希表统计元素个数,二是通过位运算,先异或消除出现两次的元素,再分组异或找出目标元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

在这里插入图片描述

🚩 题目链接

⛲ 题目描述

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:

输入:nums = [-1,0]
输出:[-1,0]
示例 3:

输入:nums = [0,1]
输出:[1,0]

提示:

2 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
除两个只出现一次的整数外,nums 中的其他数字都出现两次

🌟 求解思路&实现代码&运行结果


⚡ 哈希表

🥦 求解思路1
  1. 我们可以直接统计集合中元素的个数,找到只出现一次的俩个元素。
  2. 实现也比较简单,大家可以自行实现,此处不做过多的讲解。

⚡ 位运算

🥦 求解思路2
  1. 这道题目让我们求解的是,找到数组中只出现一次的俩个元素分别是什么。
  2. 第一次做还真的不容易想到,好在评论区有很多优秀的题解可以供我们参考。
  3. 具体求解思路如下:首先,我们还是通过异或运算,先把所有出现过俩次的元素都消除掉,遍历结束,最后的结果就是数组中只出现一次的俩个元素异或的值。
  4. 接下来重点来了,继续分组异或,怎么分组异或呢?什么意思呀?因为数组中的俩个元素只是出现了一次,那么,这俩个数字肯定是不相等的,并且,异或后,二进制中,一定有一个位置为1,也就是说这是区分俩个数字的标识。我们直接求得异或结果后最低 1及其后面的0,也叫 lowbit,可以用 s & -s 算出。
  5. 接下来再次遍历,并且进行判断,如果当前数num & lowbit == 0 ,此时在下标为0的数组中异或它的结果,反之,在下标为1的数组中异或它的结果。
  6. 具体求解的过程步骤请看下面代码。
🥦 实现代码
class Solution {
    public int[] singleNumber(int[] nums) {
        int res=0;
        for(int n:nums) res^=n;
        int[] ans=new int[2];
        int lowbit1=res&-res;
        for(int n:nums){
            if((lowbit1&n)==0){
                ans[0]^=n;
            }else{
                ans[1]^=n;
            }
        }
        return ans;
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值