此博客鏈接:
可被5整除的二進制
題目鏈接:https://leetcode-cn.com/problems/binary-prefix-divisible-by-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]
題解
前言:這題我沒有看出來是簡單題,可能因為我進制不會轉換。
思路:我認為第一步應該先把二進制能夠取出來,怎樣從數組中能按順序取二進制數;
其次把二進制數轉成十進制數;
最后判斷轉換后的十進制數是否能夠被5整除。
錯誤嘗試
我傻了,既然是字符串,轉換成整數時,肯定會超出int的長度。
class Solution {
public List<Boolean> prefixesDivBy5(int[] A) {
String str="";
int ten=0;
List<Boolean>result=new ArrayList();
for(int i=0;i<A.length;i++)
{
str+=String.valueOf(A[i]);
ten=Integer.parseInt(str,2);
if(ten%5==0)
result.add(true);
else
result.add(false);
}
return result;
}
}

代碼
由於二進制轉換成十進制會越界,那么不能利用java自帶的二進制換是十進制的函數,這里利用二進制轉十進制的公式,二進制數的每一位*2轉換成響應的十進制,為了防止數字溢出,在每次轉成十進制后都對5取余,而不是總后的結果對5取余,這里我不知道怎么證明,但是對於這種判斷能不能整除的數,在每次求數時就對某個數取余和最后對某個數取余結果是一樣的。
class Solution { public List<Boolean> prefixesDivBy5(int[] A) { Integer ten=0; List<Boolean>result=new ArrayList(); for(int i=0;i<A.length;i++) { ten=(ten*2+A[i])%5; if(ten==0) result.add(true); else result.add(false); } return result; } }
結果

