【剑指Offer】56.1 数组中只出现一次的数字,其他出现2次

NowCoder

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数。

解题思路

两个不相等的元素在位级表示上必定会有一位存在不同,将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。

diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。

x ^ y = z 互相异或可以得到另一个数

diff &= -diff; 快速找到为1的不同位
-42的补码为11010110(00101010按位取反11010101+1即11010110)

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int[] nums, int num1[], int num2[]) {
        int diff = 0;
        for (int num : nums)
            diff ^= num;
        diff &= -diff;
        for (int num : nums) {
            if ((num & diff) == 0)
                num1[0] ^= num;
            else
                num2[0] ^= num;
        }
    }
}
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int[] nums, int num1[], int num2[]) {
        int diff = 0;
        for (int num : nums)
            diff ^= num;
        int index = 0;
        // 找到sum为1的位数
        while((diff >> index & 1) == 0) index++;
        
        int first = 0;
        for(int i : nums)
            if((i >> index & 1) == 0) 
                first ^= i;
        int second = diff ^= first;
        
        num1[0] = first;
        num2[0] = second;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43469680/article/details/108305090