LeetCode系列 位運算專題

2021-10-01 08:47:11 字數 4044 閱讀 8510

目錄

位運算專題

leetcode 231 2的冪

1、分析

2、**

leetcode 762 二進位制表示中質數個數計算置位

1、分析

leetcode 136 只出現一次的數

1、分析

2、 **

leetcode 476 數字的補數

1、分析

2、**

leetcode 137 只出現一次的數字ii

1、分析

2、**

leetcode 260 只出現一次的數字iii

1、分析

2、**

leetcode 371 兩整數之和

1、分析

2、**

leetcode 201 數字範圍按位與

1、分析

2、**

leetcode 421 陣列中兩個數的最大異或值

1、分析

2、**

leetcode 477 漢明距離總和

1、分析

2、**

題目:給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。

示例 1:

輸入: 1

輸出: true

解釋: 20 = 1

如果我們用2進製來表示n,則如果是2的冪次方,那麼它的最高位一定是1,且只有這乙個1,在位運算中,有乙個操作是n&-n表示n從低位數起的第乙個1的位置k,最後值為2^k,例如n=6,二進位制為110,則-n是n的反碼加1,即001+1=010,再和n相與結果為010,所以如果是乙個2的冪次方數例如8,二進位制為1000,-n=0111+1=1000,最後結果正好等於本身n,所以我們可以判斷(n&-n)==n?即可判斷是否是2的冪次方數。

class solution 

};

題目:

給定兩個整數 l 和 r ,找到閉區間 [l, r] 範圍內,計算置位位數為質數的整數個數。

(注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算置位。還有,1 不是質數。)

示例 1:

輸入: l = 6, r = 10

輸出: 4

解釋:6 -> 110 (2 個計算置位,2 是質數)

7 -> 111 (3 個計算置位,3 是質數)

9 -> 1001 (2 個計算置位,2 是質數)

10-> 1010 (2 個計算置位,2 是質數)

由於資料不是很多,所以我們可以遍歷統計l~r中每乙個數中1的個數是否是質數,若是則結果加1,然後由於每個數的大小不是很大,最多20位,所以我們可以先用乙個雜湊表把20以內的質數存起來,方便查詢。

判斷乙個數n的第i位是否是1:n>>i&1

class solution ); //先儲存20以內的質數

int res=0;

for(int i=l;i<=r;i++) //遍歷l~r中的每乙個數

return res;

}};

題目:

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]

輸出: 1

這個題其實考察的就是異或運算,把所有的數異或起來,可以消除其中一對的數,還有就是任何數和0異或,結果都是本身。所以這個我們只需要把所有數異或起來,我們就可以得到那個單獨的數。

class solution 

};

題目:

給定乙個正整數,輸出它的補數。補數是對該數的二進位制表示取反。

注意:給定的整數保證在32位帶符號整數的範圍內。

你可以假定二進位制數不包含前導零位。

示例 1:

輸入: 5

輸出: 2

解釋: 5的二進位制表示為101(沒有前導零位),其補數為010。所以你需要輸出2。

這裡的求補數,不是我們我們之前意義上的求反碼,例如5的二進位制是101,那麼補數就是010=2,對於前面的多個0不取反,只把已有的位數取反,所以我們需要知道當前數有幾位。而且需要判斷每一位是0還是1,並取反。

class solution 

return res;

}};

題目:

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,3,2]

輸出: 3

我們可以分析每一位1的個數,當當前位1的個數是3的倍數時,那麼單獨的數在當前位一定是1,若統計當前位1的個數不是3的倍數,那麼單獨的數在當前位一定是1,這樣我們就把結果加進來。

class solution 

if(s%3) res+=1《題目:

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例 :

輸入: [1,2,1,3,2,5]

輸出: [3,5]

我們同樣可以先把所有數異或起來,那麼最終的結果就是剩下的兩個不同數的異或結果,對於這個結果肯定有一位是1,因為這兩個數不一樣,至少在某一位不一樣,那麼異或的結果就會是1,現在我們需要找出其中是1的那一位,然後根據此標識,可以把資料分成兩類,一類是在這一位是1的一類,另一類是在這一位不是1的一類,在這兩類中分別異或那麼就可以分別得出那乙個不成對的數。

class solution 

//假設s=a^b,現在s2=a,那麼b=s2^s=a^a^b=b

return vector();

}};

題目:

不使用運算子 + 和 - ,計算兩整數 a 、b ​​​​​​​之和。

示例 1:

輸入: a = 1, b = 2

輸出: 3

我們在這裡用異或^和與&運算子來解決這個問題,異或即是不進製加法,而與則可以知道那一位需要進行進製,所以我們最終的結果就是異或的結果加上進製的結果,這裡可以用遞迴解決。

class solution 

};

題目:

給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。

示例 1: 

輸入: [5,7]

輸出: 4

對於m和n,我們那彼此的二進位制來說,從高位到低位依次判斷,兩者是否一樣,當找到第乙個不一樣的位時,前面所有位代表的結果即是最後的結果,比如m和n是:***0.....和***1.......,那麼在從m到n不斷增加的過程中,一定會經過乙個***011111到***100000的過程,那麼後面結果與一定會是0,所以我們可以從n的低位開始,依次去掉n的最低位1,當n不在大於m時,則返回當前n的值。

class solution ;

vectornodes;

int findmaximumxor(vector& nums) )); //創造根節點

for(auto x:nums)

));nodes[p].son[t]=nodes.size()-1; //son裡存的就是當前下標

}p=nodes[p].son[t];}}

int res=0;

for(auto x:nums)

res+=ones*(nums.size()-ones); //1的個數乘以0的個數即是當前位的漢明距離和

}return res;

}};

Python刷遍Leetcode系列 位操作

最近,打算花點時間寫個python解決leetcode題的系列文章 面試題環節中,面試官有時挺喜歡考察一些具有特殊技巧的問題,比如 今天要講到的位操作 bit operation 比較典型的乙個問題是 leetcode 上第191號問題,題目描述 編寫乙個函式,輸入是乙個無符號整數,返回其二進位制表...

C語言系列 位操作

位操作 特此宣告 本文件皆總結於朱有鵬老師 c語言專題精講篇 一 位操作符 1 位與 1 注意 位與符號是乙個 兩個 是邏輯與。2 真值表 1 0 0 1 1 1 0 0 0 0 1 0 3 從真值表可以看出 位與操作的特點是,只有1和1位於結果為1,其餘全是0.4 位與和邏輯與的區別 位與時兩個運...

位運算專題

1.寫乙個函式,返回二進位制中1的個數 define crt secure no warnings include include 寫乙個函式,返回引數二進位制中的1的個數 int count one bits unsigned int value return count int main 2.獲...