力扣260.只出现一次的数字III

题目链接:力扣


题目描述:


解题思路:

之前我们做的136中只需要找到一个单次出现的数字,利用^得出了结果,而这道题我们需要得到两个单次出现的数字,和之前一样,我们利用^,但是我们得分成两个组,并且这两个数字不能在同一组。

1.先把所有数字异或起来

得到一个数字,可以发现得到的这个数当中的1,一定是两个数字对应位上不一样的数

2.这样我们就可以根据每个数字与该数字的关系将两个数字分到不同的组中


代码如下:

public static int[] singleNumber(int[] nums) {
            int num=nums[0];
            int i=0;
            for(i=1;i<nums.length;i++)
                num^=nums[i];
            int k=0;
            for(k=1;k<32;k++)
            {
                if(((num>>k)&1)==0)
                break;
            }
            int[] a={0,0};
            for(i=0;i<nums.length;i++)
            {
                if(((nums[i]>>k)&1)==0){
                a[0]^=nums[i];
            }else{
                a[1]^=nums[i];
            }
            }
            return a;
        }

提示:先根据k找到哪位上取到1,然后让每位数字>>k位分组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值