LeetCode總結 位運算篇

2021-06-25 13:28:52 字數 1202 閱讀 7515

位運算一直程式設計和面試中的乙個必須準備的主題。 不過現在面試中關於位運算的出現得不多,主要原因還是位運算太考察技巧了,很多時候很難在短時間內想出來,所以作為面試的題目顯得有點太花時間了。leetcode中關於位運算的題目有以下幾道:

single number

single number ii

divide two integers

pow(x, n)

先來說說

single number

, 這應該leetcode中唯一一道純粹用位運算解決的題目。題目本身要求是找出唯一乙個在陣列中出現一次的整數,而其他都會出現兩次。這裡利用到了位運算中異或的性質,就是兩個相同的數進行異或會得到0,並且任何乙個數與0的異或還是原數。利用上面的性質,只要把陣列中的元素一一異或起來,因為出現兩次的會互相抵消,最後會只剩下那個出現一次的整數,所以就搞定了。

對於single number ii

,上面的方法就沒辦法了,因為出現三次就不能利用異或的性質了,所以這個題目得使用另外的方法了。 演算法是對每個位出現1的次數進行統計,因為其他元素都會出現三次,所以最終這些位上的1的個數會是3的倍數。如果我們把統計結果的每一位進行取餘3,剩下的結果就會剩下那個出現一次的元素。這個方法對於出現k次都是通用的,包括上面的

single number

也可以用這種方法,不過沒有純位運算的方法高大上哈。

接下來看看位運算在

divide two integers

和pow(x, n)

這道題中的應用,主要是利用任何乙個整數可以表示成以2的冪為底的一組基的線性組合的性質,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。對於

divide two integers

基於上面的性質以及左移一位相當於乘以2,我們先讓除數左移直到大於被除數之前得到乙個最大的基。然後接下來我們每次嘗試減去這個基,如果可以則結果增加加2^k,然後基繼續右移迭代,直到基為0為止。因為這個方法的迭代次數是按2的冪直到超過結果,所以時間複雜度可以達到o(logn),也就是位的數量。而

pow(x, n)

也是使用同樣的方法,把冪數n分解成2的冪數的基,然後進行依次平方然後求和。這個方法算是數值運算中的乙個比較實用的方法,還是要熟練掌握。

這篇總結介紹了leetcode中幾個關於位運算的題目,雖然數量很少,不過思想上還是都挺有意義的,如果面試中遇到能提出位運算的解法還是能加分不少,所以位運算在有些題目中還是一把關鍵的**。

C 篇 位運算

位運算的用處 c c 語言提供了六種位運算子來進行位運算操作 按位與 雙目 按位或 雙目 按位異或 雙目 按位非 取反 單目 左移 雙目 右移 雙目 概念 將參與運算的兩運算元各對應的二進位制位進行與操作,只有對應的兩個二進位均為1時,結果的對應二進位制位才為1,否則為0。應用 例如,如果需要將in...

位運算總結

位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...

位運算總結

位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...