1. 程式人生 > 其它 >LeetCode 每日一題1018. 可被 5 整除的二進位制字首

LeetCode 每日一題1018. 可被 5 整除的二進位制字首

技術標籤:每日一題java演算法leetcode

1018. 可被 5 整除的二進位制字首

給定由若干 0 和 1 組成的陣列 A。我們定義 N_i:從 A[0] 到 A[i] 的第 i 個子陣列被解釋為一個二進位制數(從最高有效位到最低有效位)。

返回布林值列表 answer,只有當 N_i 可以被 5 整除時,答案 answer[i] 為 true,否則為 false。

示例 1:

輸入:[0,1,1]
輸出:[true,false,false]
解釋:
輸入數字為 0, 01, 011;也就是十進位制中的 0, 1, 3 。只有第一個數可以被 5 整除,因此 answer[0] 為真。

示例 2:

輸入:[1,1,1]
輸出:[false,false,false]

示例 3:

輸入:[0,1,1,1,1,1]
輸出:[true,false,false,false,true,false]

示例 4:

輸入:[1,1,1,0,1]
輸出:[false,false,false,false,false]

提示:

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

方法一:

直接模擬就行了~

有一點需要注意下,A 陣列最長有 30000 位,會導致溢位,每次用餘數去計算就行了。

  • 一個數可以寫為 y + 餘數, 其中 y 能被 5 整除,右移一位「2 × y 」依然能被 5 整除,所以只需判斷「2 × 餘數 + 當前二進位制位的數」是否能被 5 整除。

參考程式碼

public List<Boolean> prefixesDivBy5(int[] A) {
    int temp = 0;
    List<Boolean> ans = new ArrayList<>(A.length);
    for (int i = 0; i < A.length; i++) {
        temp = (temp * 2 + A[i]) % 5;
        ans.add(temp == 0);
    }
    return ans;
}

執行結果
在這裡插入圖片描述