剑指offer—56.数组中只出现一次的数字—分析及代码(Java)

剑指offer——56.数组中只出现一次的数字——分析及代码[Java]

一、题目

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

二、分析及代码

1. 二进制拆分 + 异或

(1)思路

结合每个数字和自身的异或为 0 的特点,如果一个整型数组中只有一个数字出现了一次,其他的数字都出现了两次,只需将所有数字异或相加即可得到。
本题可在此基础上转化为,如何将数组分为各包含一个只出现一次的数字的两部分。
一种方案是,将数组中所有数字异或后,结果相当于两个只出现一次的数字的异或。因此,其中为 1 的二进制位,对于两个只出现一次的数字,在这一位上必然一个为 0,一个为 1。可根据这一特点,将整个数组进行拆分,再结合异或方法求解。

(2)代码

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    
    
    public void FindNumsAppearOnce(int [] array, int num1[], int num2[]) {
    
    
        if (array == null || array.length < 2)
            return;
        
        int sum = 0;
        for (int i = 0; i < array.length; i++)
            sum ^= array[i];
        int index = 0;
        while ((sum & 1) == 0) {
    
    
            sum >>= 1;
            index++;
        }
        
        int n1 = 0, n2 = 0;
        for (int i = 0; i < array.length; i++) {
    
    
            if (((array[i] >> index) & 1) == 0)
                n1 ^= array[i];
            else
                n2 ^= array[i];
        }
        num1[0] = n1;
        num2[0] = n2;
        return;
    }
}

(3)结果

运行时间:19ms,占用内存:9680k。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/111561902
今日推荐