[力扣]1018. 可被 5 整除的二进制前缀 简单笔记

86 阅读2分钟

题目

给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi…

初始思路

看到题目我首先想到计算出每一个位置的二进制数大小,但当遍历到i时,使用公式计算2 ^ i计算到i位相加这个方法,时间复杂度是O (n^2^)。 为了降低时间复杂度,我们需要利用索引 i 之前计算的结果来计算当前数值。 引入新数组,bitArray 用于记录每一位 A[i] 到 A[0] 所组成的二进制串,bitArray[i + 1] 的值等于 bitArray[i] * 2 + A[i + 1] 。这很好理解:把之前的串左移一位后再加上新增的那一位数。 利用bitArray取余计算即可。

问题

如果A 数组过长,可能会出现bitArray中的数 int整型 越界的情况。如下测试用例: [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] 预期输出: [false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false ,true,false,false,true,true,true,true,false] 实际输出: [false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,true,true,true,false,false,false,false] 加粗部分即为超出上限的情况。

解决方法

我们只需要考虑取余5之后的余数即可。 给出官方证明: 官方证明