这道题太妙了,第三次才AC。
因为计算结果是可复用的,所以使用动态规划。
一开始不知道为什么错,后来发现前缀太长的时候,计算结果会溢出。换成long也无济于事。
所以使用辗转相除的思路,假设数a,商a/5不管乘以几个2,仍是a的商,所以可以置之不理。因为+1也是余数在+1。当余数a%5经过若干次变换后可被5整除时,即表示a可被5整除。
class Solution {
public List<Boolean> prefixesDivBy5(int[] A) {
int[] arr = new int[A.length];
if(A[0] == 1) arr[0] = 1;
for (int i = 1; i < A.length; i++) {
if(A[i] == 1)
arr[i] = (arr[i-1]*2 + 1) % 5;
else
arr[i] = (arr[i-1]*2) % 5;
}
List<Boolean> list = new ArrayList();
for (int i = 0; i < arr.length; i++) {
if(arr[i] == 0)
list.add(true);
else
list.add(false);
}
return list;
}
}