题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。AC的代码:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int a[100] ,flag=0;
for (int i = 0; i < data.size(); i++){
a[i] = 1;
}
for (int i = 0; i < data.size(); i++){
for (int j = 0; j < data.size(); j++){
if(j==i)continue;
if (data[i] == data[j])a[i] ++;
}
}
for (int i = 0; i < data.size(); i++)
{
if (a[i] == 1 && flag == 0){
*num1 = data[i];
flag = 1;
}
if (a[i] == 1 && flag == 1)*num2 = data[i];
}
}
};//时间复杂度为O(n(2)),无法达到要求
- 剑指Offer上的代码
#include<iostream>
using namespace std;
unsigned int FindFirstBitIs1(int num){
int indexBit = 0;
while (((num & 1) == 0) && (indexBit < 8 * sizeof(int))){
num = num >> 1;
++indexBit;
}
return indexBit;
}
bool IsBit1(int num, unsigned int indexBit){
num = num >> indexBit;
return (num & 1);
}
void FindNumsAppearOnce(int data[], int length, int* num1, int* num2){
if (data == NULL || length < 2)
return;
int resultExclusiveOR = 0;
for (int i = 0; i < length; i++)
resultExclusiveOR ^= data[i];
unsigned int indexof1 = FindFirstBitIs1(resultExclusiveOR);
*num1 = *num2 = 0;
for (int j = 0; j < length; j++){
if (IsBit1(data[j], indexof1))
*num1 ^= data[j];
else *num2 ^= data[j];
}
}//注意异或运算的性质:任何一个数字异或自己都等于0