剑指offer:数组中只出现一次的数字
Posted le-le
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:数组中只出现一次的数字相关的知识,希望对你有一定的参考价值。
题意描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路
一、思路一
使用Set集合,遍历数组,当数字第一次出现时,加入Set,当数字第二次出现时,从Set中删除。最后Set中剩余的元素就是结果,赋值给num1、num2
二、思路二
利用异或运算:两个相同数字异或=0,一个数和0异或还是它本身 。
假设数组中两个不同的值是A、B,将数组中的元素逐个异或,最终结果就是AB异或的结果。
两值的区别是,在二进制表示的情况下,至少有一位不同。我们可以取第一个1所在的位数,将数组分成两部分。
相同的数值一定在同一组,不同的值一定在不同组。将两组值逐个进行异或处理,最终得到两个只出现一次的数值。
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array == null) return ;
num1[0] = 0;
num2[0] = 0;
int bit = 0;
for(int i=0;i<array.length;i++){
bit ^= array[i];
}
int index = first(bit); //得到第一个1所在的位置
for(int i=0;i<array.length;i++){
if(isBit(array[i],index)){ //根据 当前数字index位是否为1 进行区分
num1[0] ^= array[i];
}else{
num2[0] ^= array[i];
}
}
}
public int first(int bit){
int index = 0;
while(((bit&1)==0) && index<32){ //从右向左开始查找,当前位不是1,并且没有溢出
bit >>= 1; //右移一位
index ++;
}
return index;
}
public boolean isBit(int target,int index){
return ((target >> index) & 1) == 1; //第index位是1 返回true
}
以上是关于剑指offer:数组中只出现一次的数字的主要内容,如果未能解决你的问题,请参考以下文章