題目相關
- 原題鏈接:1342. 將數字變成 0 的操作次數 - 力扣(LeetCode)
- 涉及知識:位運算
- 題目難度:★
題目解讀
如果是基本思路的話,則是模擬運算計數即可;如果是通過位運算的話,就比較巧妙了。下面是一些基本的位運算,設當前數爲x(x爲非負整數):
- x和1與運算:由於1的二進制碼如
00001
,所以x和1進行與運算的結果就是:1(若x爲奇數,即x的二進制碼最後一位爲1),0(若x爲偶數,即x的二進制碼最後一位爲0) - x和1異或運算:由於1的二進制碼如
00001
,所以x和1進行抑或運算的結果就是:x-1(若x爲奇數,即x的二進制碼最後一位爲1),x+1(若x爲偶數,即x的二進制碼最後一位爲0) - x左移一位:x/2 -1(若x爲奇數,即x的二進制碼最後一位爲1),x/2(若x爲偶數,即x的二進制碼最後一位爲0)
若x不爲0,則x的二進制表示爲1abcd...
,其中abcd等是1或者0,在將x變成0的過程中,對於每一位而言:如果該位是1,那麼需要進行一次抑或運算,將該位變成0,然後進行左移運算;如果該位是0,則直接進行左移運算即可。
所以我們可以發現對於某個確定的x的二進制表示,我們需要進行的抑或運算m和左移運算的次數n也是確定的。不難發現,其中m就等於該二進制表示中1的個數,而n則等於該二進制表示長度-1(因爲若x非0,那麼x的二進制表示的第一位總是1,而在對後面的各位進行處理了之後,臨時結果只剩下一個1,只需要再進行一次異或運算即可將之變爲0)。
Python相關
在Python中,我們有如下幾種常見位運算:
- x和1與運算,對應於
x & 1
,等價於x % 2
- x和1異或運算,對應於
x ^ 1
,等價於x - 1
(x爲奇數)、x + 1
(x爲偶數) - x左移一位,對應於
x >> 1
,等價於x // 2
具體實現
基本思路:
class Solution:
def numberOfSteps (self, num: int) -> int:
count = 0
while num:
if num % 2 == 0:
num = num // 2
else:
num -= 1
count += 1
return co
位運算:
class Solution:
def numberOfSteps(self, num: int) -> int:
tmp = str(bin(num))[2:]
return len(tmp) - 1 + tmp.count('1')