刷題筆記 位操作

2021-10-05 00:19:08 字數 2292 閱讀 8862

1、leetcode67 二進位制求和

異或操作得到兩數無進製相加的和

與操作 左移一位得到兩數的進製

一直相加,知道進製全為0

def

addbinary

(self, a, b)

:"""

:type a: str

:type b: str

:rtype: str

"""x,y=

int(a,2)

,int

(b,2

)while y:

x,y=x^y,

(x&y)

<<

1return

bin(x)[2

:]

2、leetcode136 只出現一次的數字(其他數字出現兩次)

思路:異或 e.g 2^2 ^3=3

def

singlenumber

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""iflen

(nums)==1

:return nums[0]

res=nums[0]

for i in

range(1

,len

(nums)):

res=res^nums[i]

return res

3、leetcode137 只出現一次的數字(其他數字出現三次)

設定三個變數 one two three

出現一次 one=1 two=0 three=0

出現兩次 one=0 two=1 three=0

出現三次 one=1 two=1 three=1 這時候three得到的是出現三次的數 one和two減去這部分的內容

返回one 剩下的就是只出現一次的數字

def

singlenumber

(self, nums: list[

int])-

>

int:

one,two,three=0,

0,0for num in nums:

two|

=num&one

one^

=num

three=one&two

one&

=~three

two&

=~three

return one

leetcode260 只出現一次的數字(有兩個數字出現一次,其他出現兩次)

異或計算:最後剩下的是兩個只出現一次的數字(x和y)的無進製的和ans

找到乙個數最右邊的1:ans&(-ans)

最右邊的1來自x或y其中的某乙個

再用異或在原陣列中找到x或y

def

singlenumber

(self, nums: list[

int])-

> list[

int]

: ans=

0for num in nums:

ans^

=num

diff=ans&

(-ans)

x=0for num in nums:

if num&diff:

x^=num

return

[x,ans^x]

一些知識點整理:

異或:求和/作差

相同的兩個數異或之後得到0

任何數和0異或都是她本身

求乙個數最右邊的1:

x&(-x)

-x是x取反再加1

求乙個數的二進位制表示有多少個1:

x&(x-1)

刷題 位運算

includeusing namespace std 不使用中間變數交換兩個整數的值 void swap int a,int b 整數的二進位制表達中有多少個1 int number of one int n return result 在乙個整數陣列中,只有1個數出現了奇數次,其餘數都出現了偶數次...

C LeetCode刷題 位運算

位運算篇 題名刷題通過率難度 78子集 67.2 中等136 只出現一次的數字 c leetcode刷題之 136 只出現一次的數字 single number 53.5 簡單137 只出現一次的數字 ii 60.7 中等169 求眾數 c leetcode刷題之 169 求眾數 majority ...

位運算總結(刷題)

4.繼續刷題 不用額外的變數交換兩個整數的值 異或應用 5.不用任何比較判斷找出兩個數中較大的數 6.只用位運算不用算術運算實現整數的加減乘除運算 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函...