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

94 阅读2分钟

[toc] leetcode 1018. 可被 5 整除的二进制前缀

题目描述

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

给定一个二进制数组 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 <= 105 nums[i] 仅为 0 或 1

解题思路

法1

方法1:模拟 计算

将二进制数组计算为数

判断该数是否能被5整除

循环遍历数组,计算返回结果

  • 时间复杂度(O(n))
  • 空间复杂度(O(1))

执行结果

法1

curr来记录当前的二进制前缀对应的十进制数。

在循环中,我们遍历给定的二进制数组nums,对于每个位置上的数字,将curr乘以2并加上当前位的值,然后对5取余。

如果结果等于0,则表示当前前缀可以被5整除,将对应位置的结果设为true,否则为false。

最后返回结果列表。

func prefixesDivBy5(nums []int) []bool {
    result := make([]bool, len(nums))
    curr := 0

    for i, num := range nums {
        // 将当前值乘以 2 并加上当前位的值
        curr = (curr*2 + num) % 5
        result[i] = curr == 0
    }

    return result
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 8 ms , 在所有 Go 提交中击败了 79.17% 的用户 内存消耗: 5.9 MB , 在所有 Go 提交中击败了 41.67% 的用户 通过测试用例: 24 / 24 炫耀一下:

本文由mdnice多平台发布