题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
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