『位運算』將數字變成 0 的操作次數1342

題目相關

題目解讀

如果是基本思路的話,則是模擬運算計數即可;如果是通過位運算的話,就比較巧妙了。下面是一些基本的位運算,設當前數爲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中,我們有如下幾種常見位運算:

  1. x和1與運算,對應於x & 1,等價於x % 2
  2. x和1異或運算,對應於x ^ 1,等價於x - 1(x爲奇數)、x + 1(x爲偶數)
  3. 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')

參考

  1. 用位運算處理的思路與代碼 - 將數字變成 0 的操作次數 - 力扣(LeetCode)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章