LeetCode算法第1018. Binary Prefix Divisible By 5

LeetCode算法第1018. Binary Prefix Divisible By 5

技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然後> 到中級難度,最後到hard難度全部完。目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由於篇幅和> 精力有限,其他語言的實現有興趣的朋友請自己嘗試。初級難度說的差不多的時候,我打算再加點其他內容,我可能會從操作系統到協議棧,從分佈式> 聊到大數據框架,從大數據聊到人工智能,... ...。

如果有任何問題可以在文章後評論或者私信給我。

我會持續分享下去,敬請您的關注。

LeetCode 1018. 可被 5 整除的二進制前綴(Binary Prefix Divisible By 5)

問題描述:

給定由若干 0 和 1 組成的數組 A。我們定義 N_i:從 A[0] 到 A[i] 的第 i 個子數組被解釋為一個二進制數(從最高有效位到最低有效位)。返回布爾值列表 answer,只有當 N_i 可以被 5 整除時,答案 answer[i] 為 true,否則為 false。

注:

  1. 1 <= A.length <= 30000;
  2. A[i] 為 0 或 1;

示例:

LeetCode算法第1018. Binary Prefix Divisible By 5

C語言實現:

題目的描述可能比較拗口,我們來簡單描述一下。

給定一個只有數字1和0組成的數組A,將每個元素看成二進制形式:

從第一個元素開始,判斷它是否能被5整除;

將第二個元素和第一個元素按原順序組合成新的二進制數,再判斷是否能被5整除;

將第三個和前兩個元素按照原順序再組成新的二進制數,判斷是否能被5整除;

...。

如此下去。要求返回這些二進制數是否能被5整除的結果數組。

顯然這是一個很簡單的題,我們只要完成二進制的組合再和5進行取餘操作,判斷結果是否是0即可。

我們會發現,對於某個下標i中的元素,它和前i-1個元素組成的二進制都是:

先將前i-1個元素組成的二進制先向左移動1位,然後在加上當前第i個元素。

所以我們用一個變量tmp保存每次迭代前的二進制數,我們只要再判斷(A[i] + (tmp<<1))%5是否等於0即可。

代碼如下:

LeetCode算法第1018. Binary Prefix Divisible By 5

這裡需要提醒一下,可能會有人這麼寫:

tmp = a + (tmp<<1);

res[i] = (tmp % 5) ? false : true;

如果這麼寫,在強類型語言中,當A的長度過長,tmp可能會溢出,不要忘記了題目中A的長度最大可以是30000。

即使是python這樣的弱類型語言,當A很長時,上面的代碼將影響性能,因為tmp可能會逐漸變成一個非常非常大的數字,這個時候對tmp的任何運算都是十分耗時且浪費內存的。

而寫成:

tmp = (a + (tmp<<1))%5;

res[i] = tmp ? false : true;

將使得對tmp的計算限制在了32位整形的計算範圍內,甚至你可以將tmp設置char, 因為char不會超過5,所以一個字節足夠了。

LeetCode算法第1018. Binary Prefix Divisible By 5

Java語言實現:

Java 的實現和C語言的實現一致,不再撰述。代碼如下:

LeetCode算法第1018. Binary Prefix Divisible By 5

LeetCode算法第1018. Binary Prefix Divisible By 5

Python語言實現:

Python 的實現和C語言的實現一致,不再撰述。代碼如下:

LeetCode算法第1018. Binary Prefix Divisible By 5

LeetCode算法第1018. Binary Prefix Divisible By 5


謝謝大家一直以來的關注和支持!

我一直在努力的寫好每一篇文章,畫好每一份插圖。但是作為一個996從業人員,時間精力十分有限。所以針對評論部分,以後只回答粉絲的問題和私信。希望僅僅是路過的朋友能夠體諒,希望更多人關注《吾是我師》,謝謝!


相關推薦

推薦中...