Andy Back-end Dev Engineer

剑指offer-数组中只出现一次的数字


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

解体思路

先考虑只有一个出现一次的数字: 利用异或的特性,x^y^x=y^x^x=y。对数组所有元素一次进行异或操作,最终得到的值就是那个只出现一次的数字。

现在考虑有两个只出现一次的数字: 假设两个只出现一次的数字分别为a、b,对数组元素进行两两异或后得到的值为c,可知c=a^b。因为a和b一定不同,所以c不等于0,那么c的二进制表示中一定有一位是1,即a,b在此位上分别为0,1或1,0。假设该位置是从低位起第x位,那么将数组分成两组,一组中的数字在第x位是0,另一组中的数字在第x位是1,则a和b分别属于两个子数组。分别求子数组中唯一只出现1次的数字,即可得到a和b

代码实现:

public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array == null || array.length < 2) {
            num1[0] = 0;
            num2[0] = 0;
            return;
        }
        
        int sum = 0;
        for(int num : array)
            sum ^= num;
        sum &= -sum;
        
        for(int num : array) {
            if((num & sum) == 0) {
                num1[0] ^= num;
            } else {
                num2[0] ^= num;
            }
        }
    }
}

Comments

Content