1.一个整型数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。
思路:对数组所有数求亦或和,最终答案就是这个数
2.一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:对数组所有数求亦或和,会得到要求的两数的亦或和ans。假设ans二进制的第i位为1,则说明所求的两个数这一位不同。此时将所有第i位为1的数与ans亦或得到ans1,将所有第i位为0的数与ans亦或得到ans2,则得出答案。
class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { int n = data.size(); int ans = 0; for(int i = 0; i < n; i++) { ans ^= data[i]; } int x = ans; int cnt = 0; while (x) { cnt++; if (x % 2) { break; } x /= 2; } int ans1 = ans, ans2 = ans; for (int i = 0; i < n; i++) { if (data[i] ^ (1 << cnt)) ans1 ^= data[i]; else ans2 ^= data[i]; } *num1 = ans1, *num2 = ans2; } };
