LeetCode 1018. 可被 5 整除的二进制前缀

121 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

一、题目描述:

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

给定一个二进制数组 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

二、思路分析:

基本思路:
遍历一边就可以,一个一个验证就好
稍微优化一下,不需要每一次都重新算,只需要把0~i位构成的二进制数*2 + 第i+1位就可以得到当前的数
坑:
第一次提交翻车了,int爆掉了,这时候需要对上一次计算的数进行处理,使其保证被5除的性质不变的情况下尽可能小,代码中直接对5取余,其他部分没有影响。
(用二进制移位会不会更快啊)

三、AC 代码:

class Solution {
public:
    vector<bool> prefixesDivBy5(vector<int>& A) {
        int current = 0;
        int size = A.size();
        vector<bool> res(size);
        for(int i = 0 ;i < size; i++){
            current = (current * 2 % 5) + A[i];
            res[i] = (current % 5 == 0);
        }
        return res;
    }
};

范文参考:

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

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