牛客网题目-数组中只出现1次的数字
题目描述如下:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
题解的主要思想
-
异或运算,两个数字相同,异或运算所得结果为0,如果数组中只有一个数出现一次,其他数字都是出现两次,
根据异或运算原理,就可以将数组所有数字异或,就可以找出,这个只出现一次的数字 -
如果数组只有两个数字出现一次,可以将数组分成两组,每组只含有一个只出现一次的数字。如何将数组分成这样的子数组?
数组中所有数字异或所得结果必定不会0,可以从这个数字提取某一位等于1,将数组所有数组就可以分成,与改位为1的,和不为
1,的两组,这样每组异或,就可以获得相应的数字。
代码如下:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int len = data.size();
if( len < 2 ){
return ;
}
int k = 0;
for(int i=0;i<len; i++){
k ^= data[i];
}
int index = fisrtIndexOf1(k);
*num1 = *num2 = 0;
for(int i=0; i<len ; i++){
if((data[i] >> index)&0x1){
*num1 ^= data[i];
}else {
*num2 ^= data[i];
}
}
}
int fisrtIndexOf1(int num){
int index = 0;
while( num ){
if(num &(0x1))
return index;
num = num>>1;
++index;
}
return -1;
}
};
作者: 盛夏落木
出处: https://www.cnblogs.com/wanshuafe/
关于作者:专注云存储,文件系统领域,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(wanshuafe@163.com)咨询.