20200114 可被 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] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-prefix-divisible-by-5 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 public List<Boolean> prefixesDivBy5(int[] A) { }
思路:遍历数组 %5为0时为true 否则false
public static List<Boolean> prefixesDivBy5(int[] A) { List<Boolean> l=new ArrayList<Boolean>(); String s=""; for (int i:A){ s=s+i; i=Integer.valueOf(s,2); l.add(i%5==0); } return l; }
提交失败
检查报错发现若案例A数组长度超过31位时 Integer.valueOf转换失败报错 原来有长度限制
尝试用Long.valueOf 发现长度超过64位也转换失败
看到大佬的思路
public List<Boolean> prefixesDivBy5(int[] A) { List<Boolean> ans = new ArrayList<>(); int num = 0; for (int i = 0;i < A.length;i++) { num <<= 1; num += A[i]; num %= 10; ans.add(num % 5 == 0); } return ans; }
<<是移位运算符
如 3<<1 结果是6 就是将3转2进制 0011左移一位低位补0得到0110 即6
这样
for (int i = 0;i < A.length;i++) {
num <<= 1;
num += A[i];}
很轻易能将2进制转成10进制