先贴题目:
根据题目直接模拟,就会想到如下方法:计算每次形成的十进制数值,然后看能否被5整除。
class Solution {
public List<Boolean> prefixesDivBy5(int[] A) {
List<Boolean> res = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for(int i=0;i<A.length;i++){
sb.append(A[i]);
int num = Binary2Dec(sb.toString());
res.add(num % 5 == 0?true:false);
}
return res;
}
public static int Binary2Dec(String binary){
int n = binary.length();
int dec = 0;
int j = n;
for(int i=0;i<n;i++){
int temp = Integer.parseInt(String.valueOf(binary.charAt(i)));
dec += temp * Math.pow(2,j-1);
j--;
}
return dec;
}
}
但是这样有问题,在
[1,0,0,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,0,0,1]
测试用例中通不过,debug看到
在java中,int用4个字节表示,现在已经超出了2147483647(即2^31-1),所以还是需要移位操作,并且每次只保存余数。
class Solution {
public List<Boolean> prefixesDivBy5(int[] A) {
List<Boolean> res = new ArrayList<>();
int dec = 0;
for (int i = 0; i < A.length; i++) {
dec = ((dec << 1) + A[i]) % 5; //每次只保存余数
res.add(dec == 0);
}
return res;
}
}
左移位操作符(<<):将操作数向左移动指定的位数,并在低位补0。
例如 int i = 10; 求 i << 5。首先将10表示为二进制1010(前面省略28个0),然后向左移动5位并在低位补5个0,就成了101000000(前面省略23个0)。所以10<< 5 = 320