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,則該函...