剑指Offer—40—数组中只出现一次的数字

来源:互联网 发布:php特殊字符转义函数 编辑:程序博客网 时间:2024/05/17 22:53

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

package A40数组中只出现一次的数字;//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果public class Solution {    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {        //一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。        // 桶排序,这个数组较大的时候就没办法了        // 异或,        // 假设只有一个数字的单独的,那么全部数字异或的结果就是这个数字        // (可自己举例,相同的异或结果为0,0与任何数异或都是这个数)        //回到题目,现在是两个数字,那么就将两个数字分到两个数组中,        //区分的办法是根据全部数字最终异或的结果,第一个为1的肯定是两个不同数的不同位置,        //把那个位上为1的分为一组,为0的分为另一组,然后分别对小组异或即可求得结果        if (array == null || array.length < 2) {            return ;        }        int num = 0;        for (int i = 0; i < array.length; i++) {            num = num ^ array[i];        }        // 求第一个为1的索引        int index = 0;        while (num > 0){            if ((num & 1) == 1){                break;            }            num = num >> 1;            index++;        }        for (int i = 0; i < array.length; i++) {            if (((array[i] >> index) & 1) == 1){                num1[0] ^= array[i];            }else {                num2[0] ^= array[i];            }        }    }}
原创粉丝点击