剑指offer56.1 平衡二叉树
一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。
你可以假设这两个数字一定存在。
样例
输入:[1,2,3,3,4,4]
输出:[1,2]
思路:
1.首先把所有数值异或得到sum。
2.找到二进制sum中右边起,第一个不为1的数值,记该位为index,因此nums中的数值可以为了两类,第index位不为1的和第index位为1的,并且出现1次的数值分别出现在这两类中。
3.把nums中第index位不为1的数值全部异或,因此得到第一个数值num1。
4.把sum和nums1异或得到第二个数值num2
AcWing-73 C++ code:
class Solution {
public:
vector<int> findNumsAppearOnce(vector<int>& nums) {
if(nums.size() < 2){
return {};
}
int n = nums.size();
int sum = 0;
int num1 = 0, num2 = 0;
//把所有数值都异或
for(int i = 0; i < n; i++){
sum ^= nums[i];
}
//记录异或的值哪一位是1
int index = 0;
while(!(sum >> index & 1)){
index++;
}
//int flag = 1;
//while(!(flag & sum)){
//flag = flag << 1;
//}
//把index不为1的数值异或因此得到第一个数值
for(int i = 0; i < n; i++){
if((nums[i] >> index) & 1){
num1 ^= nums[i];
}
//if(flag & nums[i]){
//num1 ^= nums[i];
//}
}
num2 = num1 ^ sum;
return {num1, num2};
}
};