此博客链接:
可被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; } }