位運算題 刷題總結

2021-10-01 06:12:18 字數 1377 閱讀 7932

給定乙個整數陣列 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個數出現了奇數次,其餘數都出現了偶數次...