找出数组中两个只出现一次的数字
题目:一个整数数组里除了两个数字之外,其他的数字都出现了两次,找出这两个只出现一次的数字。
要求:时间复杂度是O(n),空间复杂度是O(1)。
答:
#include "stdafx.h" #include <iostream> using namespace std; bool isBitOne(int number, int index) { number = number >> index; if (number & 1) { return true; } return false; } //找出数组中两个只出现一次的数字 void FindNumber(int arr[], int length, int &valOne, int &valTwo) { if (NULL == arr || length <= 0) { return; } int allXor = arr[0]; for (int i = 1; i < length; i++) { allXor ^= arr[i]; } int index = 0; while (!(allXor & 1) && index < 32) { index++; allXor = allXor >> 1; } for (int i = 0; i < length; i++) { if (isBitOne(arr[i], index)) { valOne ^= arr[i]; } else { valTwo ^= arr[i]; } } } int _tmain(int argc, _TCHAR* argv[]) { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3, 4, 5, 6, 8, 9, 7, 10}; int valOne = 0; int valTwo = 0; FindNumber(arr, sizeof(arr)/sizeof(arr[0]), valOne, valTwo); cout<<valOne<<" "<<valTwo; cout<<endl; return 0; }
运行界面如下: