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

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

一、题目描述:

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

二、思路分析:

这道题难点在大数求余,只需要知道:

对多个数字的相加再求模和先对中间部分结果求模再相加之后求模的结果是一样的。

for循环内这其实是一个通用模板

三、AC 代码:

/**
 * @param {number[]} A
 * @return {boolean[]}
 */
var prefixesDivBy5 = function (A) {
  let ans = []
  let sum = 0
  for (let i = 0; i < A.length; i++) {
    sum = sum * 2 + A[i]
    sum = sum % 5
    ans.push(sum == 0)
  }
  return ans
};

范文参考:

以第一个数字开始,每次位运算一波再加上当前数字的值对5进行取余,直接返回结果就行 - 可被 5 整除的二进制前缀 - 力扣(LeetCode)

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

【小魏】看不懂打我系列 1018. 可被 5 整除的二进制前缀 - 可被 5 整除的二进制前缀 - 力扣(LeetCode)