【刷题笔记】1018. 可被 5 整除的二进制前缀

150 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

一、题目描述:

1018. 可被 5 整除的二进制前缀 - 力扣(LeetCode) (leetcode-cn.com)

给定一个二进制数组 nums ( 索引从0开始 )。

我们将xi 定义为其二进制表示形式为子数组 nums[0..i] (从最高有效位到最低有效位)。

  • 例如,如果 nums =[1,0,1] ,那么 x0 = 1, x1 = 2, 和 x2 = 5。

返回布尔值列表 answer,只有当 xi 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。

 

示例 1:

输入:nums = [0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为 true

示例 2:

输入:nums = [1,1,1]
输出:[false,false,false]

提示:

  • 1 <= nums.length <= 10^5 
  • nums[i] 仅为 0 或 1

二、思路分析:

数学(注意 int 溢出)

  1. 边界条件;
  2. for 循环对每一个元素利用 2X + A[i] 计算: 2. 若用方法 1 ,则累加过多时 int 会溢出,造成结果错误; 3. 若用方法 2 ,在每次计算后都对结果进行除去 5 取余即可,不会出现溢出的情况。
  3. 每次取余的结果为 0 ,则添加 true 进去,否则添加 false;
  4. 输出结果即可。

三、AC 代码:

class Solution {
    public List<Boolean> prefixesDivBy5(int[] A) {
        List<Boolean> answer = new ArrayList<>();
        if(A.length == 0)   return answer;
        int getValue = 0;
        for(int i=0;i<A.length;i++){
            /// 1溢出
            getValue = getValue * 2 + A[i]; 
            answer.add(getValue % 5 == 0);
            /// 2成功
            getValue = (getValue * 2 + A[i]) % 5; 
            answer.add(getValue == 0);
        }
        return answer;
    }
}

范文参考:

【1018. 可被 5 整除的二进制前缀】对判断操作进行简单模拟 - 可被 5 整除的二进制前缀 - 力扣(LeetCode)

1018.这实际上是一个数学题,通过此题需要记住四个模运算恒等式(见题解) - 可被 5 整除的二进制前缀 - 力扣(LeetCode)