1018. Binary Prefix Divisible By 5*

1018. Binary Prefix Divisible By 5*

https://leetcode.com/problems/binary-prefix-divisible-by-5/

题目描述

Given an array A of 0s and 1s, consider N_i: the i-th subarray from A[0] to A[i] interpreted as a binary number (from most-significant-bit to least-significant-bit.)

Return a list of booleans answer, where answer[i] is true if and only if N_i is divisible by 5.

Example 1:

Input: [0,1,1]
Output: [true,false,false]
Explanation: 
The input numbers in binary are 0, 01, 011; which are 0, 1, and 3 in base-10.  Only the first number is divisible by 5, so answer[0] is true.

Example 2:

Input: [1,1,1]
Output: [false,false,false]

Example 3:

Input: [0,1,1,1,1,1]
Output: [true,false,false,false,true,false]

Example 4:

Input: [1,1,1,0,1]
Output: [false,false,false,false,false]

Note:

  • 1 <= A.length <= 30000
  • A[i] is 0 or 1

C++ 实现 1

参看 Detailed Explanation using Modular Arithmetic O(n) 这个解答, 相当之详细. 大致思路如下, 先介绍几个前置概念:

  1. 假设当前访问 A[i - 1], 表示的数为 old_number, 那么当访问 A[i] 时, 所表示的数 new_number = old_number * 2 + A[];
  2. 如果直接判断 new_number 是否能被 5 整除, 容易出现溢出的问题, 因为按照上面遍历的方式, C++ 只能保存 32-bit 的数据, 但是题目中说明 1 <= A.length <= 30000.
  3. 我们不需要知道具体的 new_number 数值大小, 而只需要它与 5 的余数;
  4. 发现一个数学公式: (a*b + c) % d = ((a%d)*(b%d) + c%d) % d, 因此 new_number % 5 可以表示为 ((old_number % 5) * 2 + A[i]) % 5.
  5. 由第 4 点, 可以将 number % 5 作为一个整体, 更新公式为 a = (a * 2 + A[i]) % 5.
class Solution {
public:
    vector<bool> prefixesDivBy5(vector<int>& A) {
        vector<bool> answer;
        int old_number = 0;
        for (int i = 0; i < A.size(); ++ i) {
            old_number = ((old_number % 5) * 2 + A[i]) % 5;
            answer.push_back(old_number == 0);
        }
        return answer;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值