260. 只出現一次的數字 III
給定一個整數數組 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。
示例 :
輸入: [1,2,1,3,2,5]
輸出: [3,5]
方法:異或
我知道異或可以使所有一對一對的值都消失,得到只出現過一次的數的異或值,但是這題的重點是,你得到兩個只出現一次的數之後,如何區分?
這裏要提到一個知識:lowbit,它指的是當前數最右邊第一個爲1的bit ,求法 lowbit(s) = s & -s
之後可以通過這個 lowbit 把所有的值分爲兩組,而兩個只出現一次的值就分別在兩個不同的小組,再對每個小組進行異或即可!
class Solution {
public:
vector<int> singleNumber(vector<int>& nums)
{
int sign = 0;
//取得數組中兩個唯一數的按位異或結果
for (int i = 0; i < nums.size(); i++)
{
sign ^= nums[i];
}
//獲取區分兩個唯一數的比特位所代表的值
//也可以寫成:sign &= (~sign) + 1
sign &= -sign;
int n1 = 0, n2 = 0;
//通過標識,區分兩個數組
for (int i = 0; i < nums.size(); i++)
{
if ((nums[i] & sign) == sign)
n1 ^= nums[i];
else
n2 ^= nums[i]; ;
}
return { n1,n2 };
}
};
268. 缺失數字
這道題是我沒想到用位運算的,這題告訴了一個道理,位運算的異或可以找那個唯一數!!!(唯一的意思是,和別的數字出現的頻率不一樣!!!)
給定一個包含 0, 1, 2, …, n 中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。
示例 1:
輸入: [3,0,1]
輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8
方法:
只有一個數字沒出現,假如在裏面把0,1,2…n再加入一遍,那麼異或的值就是隻出現一次的值,就是要求的值!
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
// int arr[n+1] = {0};
// for(int i = 0;i < n;i++){
// arr[nums[i]] ++;
// }
// int count = 0;
// for(int i = 0;i < n+1;i++){
// if(arr[i] == 0) return i;
// }
// return 0;
int a = 0;
for(int i = 0;i < n+1;i++){
a ^= i;
}
for(int i = 0;i < n;i++){
a^= nums[i];
}
return a;
}
};
未完待續…