位運算:
牢記: res &= res - 1可以計算1的數目。
如果是負數,如何計算二進位制位中1的個數。
while res != 0 : res = res & (res-1); num+=1 —這樣還不夠,必須給乙個上界和下界。、
不能直接每次右移一位然後&1,因為這樣的話 會迴圈-1,直到溢位。
這類題目就是三個,乙個數字出現一次(其他偶數次),兩個數字出現一次,乙個數字出現一次(其他k次)
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。
解答方法稍微不易想到,首先看清楚位運算的基本規則:
異或^:兩個位,相同異或結果為0,不同為1
並 & : 都是1則1,有0 為0
| 或: 有1則1,無1則0
如果乙個陣列中其他都是出現兩次,那麼他們異或結果肯定是0,因為0異或乙個數等於它本身,所以這個陣列全部進行異或,結果就是不同的那個數。
此時,題目要求陣列裡有兩個,那麼我們只需要把他們進行分開:基準就是全部異或最後的結果,某一位不等於0的,那麼就是後面異或分開的標準。
全部異或如何找到是第幾位的,可使用&來找到,從1開始,不斷乘以2,直到&之後結果等於1為止。
class
solution
:def
singlenumbers
(self, nums: list[
int])-
> list[
int]
: st = nums[0]
for i in
range(1
,len
(nums)):
st = st ^ nums[i]
# 所有進行異或,最後得到的就是那個跟別人不一樣的。
a = a >> 1其實右移一位就是整除以2.
class solution:
def foundoncenumber(self , arr , k ):
# write code here
# 對每一位進行累加,勉強可達到時間o(n), 空間o(1).
record = [0]*32
for i in range(len(arr)):
res = arr[i]
bit = 0
while res > 0:
if res & 1:
record[bit] += 1
bit += 1
res = res >> 1 #這裡需要注意
res = 0
bit = 0
for i in range(len(record)):
if record[i] % k != 0:
res += 2**bit
bit += 1
return res
位運算題目彙總
給你乙個整數陣列 arr 請你將陣列中的元素按照其二進位制表示中數字 1 的數目公升序排序。如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小公升序排列。請你返回排序後的陣列。輸入 arr 0 1,2 3,4 5,6 7,8 輸出 0,1,2,4,8,3,5,6,7 解釋 0 是唯...
leetcode 位運算題目彙總 上)
最近在看位運算的知識,十分感嘆於位運算的博大精深,正好leetcode有 bit manipulation 的專題,正好拿來練練手。給出乙個由不同的數字組成的陣列,列舉它的子陣列 子集 這道題我之前用遞迴解過,而且效率還不錯 beat 83.33 解法如下不加詳述了 param nums retur...
位運算技巧
1.lowbit x 實現 int lowbit int x 這個函式用來求數中二進位制位中最低位的1 完整求法 log2 lowbit x 需要注意的是,答案的範圍是0 30,因為31位是符號位,求出來的值為負數,原因如下 設x 0x8000 0000,那麼設res lowbit x 0x8000...