数组中只出现一次的数字分析过程加代码

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
//首先要从所有的数组中找出只出现一次的数字我们先考虑下从所有数组中找出现一次的数字只有一个的时候该怎么办
//首先清楚两个点0和任何数字异或都是这个数字本身,两两相同的数字进行异或结果是零,得知了这两个结论我们就有思路去处理这道题了,因为这道题中只有一个数字出现了一次,其他数字都出现了两次,只要把数组中的第一个数字拿出来和所有的
//数字进行异或就可以得出谁是只出现一次的数字了。ok处理完找出一个只出现一次的数字之后我们开始处理我们遇到的这道题。
//同样的选取一个数字开始从下一个数字遍历整个数组得到的最终的异或结果肯定不为零,因为有两个不相同且出现一次的数字 举个例子假如这两个数字是5和6,5^6=0001,我们设置一个flag=1,利用Integer.SIZE来计算出二进制数的位数
//找出异或结果之后从左到右出现的第一个1,记录到flag中,之后用这个值去与数组中的每一个数字,肯定会将所有数字分为两组,每组之中肯定都会出现一个出现一次的数字,这样我们就又回到了我们刚开始所说的那个问题了好了问题解决。
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(arraynull||num1null||num2==null){
return;
}
num1[0] = 0;
num2[0] =0;
int num = array[0];
for(int i=1;i<array.length;i++){
num ^= array[i];
}
int flag = 1;
//第二部根据分析可得异或的结果一定不为零
int size = Integer.SIZE;//用来计算整形的比特位
while(size>=0){
if(((flag<<size) & num) !=0){
flag <<= size;
}
size–;//如果没找到就让size-1,之后再继续找第一个出现一的位置

    }
    for(int i =0;i<array.length;i++){//将数组分成两组
        if((array[i]&flag) != 0){
           num1[0] ^= array[i];
        }else {
            num2[0] ^= array[i];
        }
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值