Python刷遍Leetcode系列 位操作

2021-09-26 14:33:57 字數 2649 閱讀 9481

最近,打算花點時間寫個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

print

(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程式進行攝氏度和華氏度的轉換 步驟一 分析問題的計算...