LeetCode 每日一題1018. 可被 5 整除的二進位制字首
阿新 • • 發佈:2021-01-25
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;
}
執行結果