leetcode: Single Number III

本文详细介绍了如何利用位操作和异或运算解决数组中寻找只出现一次的数的问题。通过将数组元素分为两组,一组中每个元素都出现了两次,另一组中恰好有一个元素只出现一次。利用特定位的异或性质,找出这个唯一的元素。此方法巧妙地解决了单一元素在数组中的定位问题。

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

按照前题的思路,还是利用异或求解....我们知道nums中的所有数异或的结果就是这两个只出现一次的数的异或结果....那么如果能找到一种分类方式将nums数组分成两组,每组中仅包含一个只出现一次的数二其他数在本组中都出现两次即可.....这种分类方法可以基于某一位的值来判断...因为出现两次的数根据某一位的值肯定都会被分在一边,而两个只出现一次的数肯定存在某一位不同.....我们不妨找到这两个数第一个不同的位,用该位的值来作为分类依据即可.....按照异或的性质,同0异1,那么这两个数异或结果中第一个为1的位就是我们要寻找的分类依据》。。。

任意一个数与上它的补码的结果即为这个数为1的最低位...那么思路很清楚了....

public class Solution {
    public int[] singleNumber(int[] nums) {
        int diff=0;
        for( int n:nums )
        {
            diff ^= n;
        }
        diff=diff&(-diff);
        int[] res=new int[2];
        for( int n:nums )
        {
            if( (n&diff)==0 )
            {
                res[0]^=n;
            }
            else
            {
                res[1]^=n;
            }
        }
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值