給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。
示例 :方法:異或輸入: [1,2,1,3,2,5]
輸出: [3,5]
我知道異或可以使所有一對一對的值都消失,得到只出現過一次的數的異或值,但是這題的重點是,你得到兩個只出現一次的數之後,如何區分?
這裡要提到乙個知識:lowbit,它指的是當前數最右邊第乙個為1的bit ,求法lowbit(s) = s & -s
之後可以通過這個 lowbit 把所有的值分為兩組,而兩個只出現一次的值就分別在兩個不同的小組,再對每個小組進行異或即可!
class solution
//獲取區分兩個唯一數的位元位所代表的值
//也可以寫成:sign &= (~sign) + 1
sign &
=-sign;
int n1 =
0, n2 =0;
//通過標識,區分兩個陣列
for(
int i =
0; i < nums.
size()
; i++
)return;}
};
這道題是我沒想到用位運算的,這題告訴了乙個道理,位運算的異或可以找那個唯一數!!!(唯一的意思是,和別的數字出現的頻率不一樣!!!)
給定乙個包含 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 ;
// for(int i = 0;i < n;i++)
// int count = 0;
// for(int i = 0;i < n+1;i++)
// return 0;
int a =0;
for(
int i =
0;i < n+
1;i++
)for
(int i =
0;i < n;i++
)return a;}}
;
未完待續… 位運算總結(刷題)
4.繼續刷題 不用額外的變數交換兩個整數的值 異或應用 5.不用任何比較判斷找出兩個數中較大的數 6.只用位運算不用算術運算實現整數的加減乘除運算 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函...
位運算 刷題總結
位運算 從現代計算機中所有的資料二進位制的形式儲存在裝置中。即 0 1 兩種狀態,計算機對二進位制資料進行的運算 都是叫位運算。判斷兩個數是否異號 int x 1 y 2 bool f x y 0 true int x 3,y 2 bool f x y 0 false 這個技巧還是很實用的,利用的是...
刷題 位運算
includeusing namespace std 不使用中間變數交換兩個整數的值 void swap int a,int b 整數的二進位制表達中有多少個1 int number of one int n return result 在乙個整數陣列中,只有1個數出現了奇數次,其餘數都出現了偶數次...