最近,打算花點時間寫個python解決leetcode題的系列文章~
面試題環節中,面試官有時挺喜歡考察一些具有特殊技巧的問題,比如:今天要講到的位操作(bit operation)。
比較典型的乙個問題是 leetcode 上第191號問題,
題目描述
編寫乙個函式,輸入是乙個無符號整數,返回其二進位制表示式中數字位數為 『1』 的個數(也被稱為漢明重量)。
示例 :
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串
00000000000000000000000000001011
中,共有三位為
『1』。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串
00000000000000000000000010000000
中,共有一位為
『1』。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串
11111111111111111111111111111101
中,共有
31位為
『1』。
● 題目難度: easy
通過次數:2k
提交次數:4.9k
相關話題 位運算
背景知識:
常見程式語言中,**中的 n&(n-1)有什麼作用?
計算機中如何表示負數?
設計計算機的人設想,把最高位作為符號位,0表示正數,1表示負數,於是原碼誕生了。計算機中8位二進位制數(原碼)的表示範圍如下:小學六年級英語一對一輔導負數:1 111 1111 ~ 1 000 0000 (-127 ~ -0),正數:0 000 0000 ~ 0 111 1111 (0 ~ 127)但是如果在計算機中像這樣用原碼表示負數,那麼數的相加減就很不方便了。因此計算機中有符號數都是用補碼形式表示,此點需時刻牢記於心!
補碼怎麼計算?
1、正數:原碼和補碼一致
2、負數:原碼除符號位外後按位取反,然後加1 (從補碼求原碼的方法:符號位除外,先減1,再按位取反。)
3、[+0]補=[-0]補=0x00000
如果用4個位元組來表示-7~8,則-3的在計算機中的表示是1101(原碼為1011),則-2的在計算機中的表示是1110(原碼為1010),-1在計算機裡用二進位制表示就是全1,4位2進製為1111,16進製為:0xffffff
如果n>0,正數的補碼和原碼一致
(1)當n為正奇數時(n的二進位制表示的末位為1):
n: ******xx1
n-1: ******xx0
n&(n-1): ******xx0
n&(n-1)相當於去掉n的二進位制表示中最右邊的乙個1。
(2)當n為正偶數時(n的二進位制表示的末位為0):
n: ***xx1000
n-1: ***xx0111
n&(n-1): ***xx0000
n&(n-1)相當於去掉n的二進位制表示中最右邊的乙個1。
如果n<0
(3)當n為負奇數時,比如-1:
n=-1: 1111
n-1=-2: 1010
n&(n-1): 1010
n&(n-1)相當於去掉n的二進位制補碼中最右邊的乙個1。
(4)當n為負的偶數時,比如-2:
n=-2: 1010
n-1=-3: 1101
n&(n-1): 1000
n&(n-1)相當於去掉n的二進位制補碼中最右邊的乙個1。
如果n=0
(5) 當n=0時n=0:
n-1=-1: 1111
n&(n-1): 0000
n&(n-1)相當於去掉n的二進位制補碼中最右邊的乙個1(或 不處理,因為0的二進位制補碼中沒有1)。
如,9999 的二進位制表示為:0010 0111 0000 1111,共有8個1.
綜上(1)、(2)、(3)、(4)、(5)可知,n&(n-1)等價於去掉有符號整數整數n的二進位制補碼中最右邊的乙個1,無論n為正、為負或為0 .
n=n&(n-1)==0 可以用來判斷n是否為2的冪次方(即:n中除符號位以外只有乙個1,其他bit均為0)
因此,此題的解題思路如下:
使用 n = n&(n-1) 進行迭代,每進行一次,將最右側存有1的bit的值置為0,直到全0,終止計數。
已ac**:
class
solution
(object):
defhammingweight(self, n):
「」":type n: int
:rtype: int
「」"count =
0while
n >0:
n = n & (n-1)
count = count +
1return
count;
如果需要在本地測試或debug,相應的**如下:
obj =
solution
()n =
0b0000000000000000000000000001011
(obj.hammingweight(n))
leetcod刷題 移動零
週末了,睡了好久的懶覺了,起來去實驗室寫專案之前再刷一道題提提神就好了。給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。這道題也...
leetcod刷題 404 左葉子之和
題目描述 計算給定二叉樹的所有左葉子之和。示例 在這個二叉樹中,有兩個左葉子,分別是 9 和 15,所以返回 24。我的解答 遞迴,左右結點不同處理。definition for a binary tree node.public class treenode class solution publ...
Python學習 第二遍
computer原指專門負責計算的人,後來演變成特指計算編譯,譯為計算機 計算機是能根據一組指令運算元據的機器。五大部件對應硬體 擴充套件 計算機的工作原理a b 程式語言的種類 常用的程式語言 anaconda工具的使用問題 如何利用python程式進行攝氏度和華氏度的轉換 步驟一 分析問題的計算...