位運算技巧和題目彙總 更新

2021-10-07 03:51:43 字數 1858 閱讀 6971

位運算:

牢記: 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...