LeetCode.1018-可被5整除的二进制数(Binary Prefix Divisible By 5)

这是小川的第379次更新,第407篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第241题(顺位题号是1018)。给定0和1的数组A,考虑N_i:从A[0]A[i]的第i个子数组被解释为二进制数(从最高有效位到最低有效位)。

返回布尔值answer列表,当且仅当N_i可被5整除时,answer[i]true

例如:

输入:[0,1,1]
输出:[true,false,false]
说明:二进制输入数字为0,01,011,转为十进制数,分别为0,1和3。只有第一个数字可以被5整除,所以answer[0]true

输入:[1,1,1]
输出:[false,false,false]

输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]

输入:[1,1,1,0,1]
输出:[false,false,false,false,false]

注意

  • 1 <= A.length <= 30000
  • A[i]为0或1

02 解题

题目的意思是A中都是二进制位的0和1,依次从左到右,判断二进制组成的十进制数能否被5整除,将每次的判断结果存入List

按照常规的操作,循环A中的元素,组成一个二进制字符串,再转成十进制数,再对5取余,将判断结果存入List中,但是有个问题需要考虑,A的长度上限是30000,如果组合成的二进制字符串长度过长,是否还能被转成整数?答案存疑,那我们需要换另外一种思路来解决问题了。

结合例子来看,[1,1,1,0,1],从左往右看:
第一次计算,二进制数为1,转为十进制为1,1%5=1。
第二次计算,二进制数为11,转为十进制为3,(1*2+1)%5 = 3%5 =3。
第三次计算,二进制数为111,转为十进制为7,(3*2+1)%5 = 7%5 =2。
第四次计算,二进制数为1110,转为十进制为14,(2*2+0)%5 = 4%5 = 14%5 =4。
第五次计算,二进制数为11101,转为十进制为29,(4*2+1)%5= 9%5 = 29%5 =4。

从例子中可以看到,新的二进制数是在前一次二进制数的基础上左移一位得到的,即 num[i+1] = (A[i]<<1) + A[i+1]A[i]为前一次的十进制整数,A[i+1]为在前一次二进制数尾部新加的0或1,题目只是需要我们判断每次新组成的二进制数能否被5整除,我们可以利用前一次取余的结果左移,因为其中能被整除的部分是不太需要关心的,这样可以避免数字过大超出范围的风险。

public List<Boolean> prefixesDivBy5(int[] A) {
    List<Boolean> answer = new ArrayList<Boolean>();
    int num = 0;
    for (int i=0; i<A.length; i++) {
        // 写成 num = (num<<1) + A[i]; 也是一样的效果
        num = num*2 + A[i];
        num %= 5;
        answer.add(num == 0);
    }
    return answer;
}

小结

算法专题目前已连续日更超过七个月,算法题文章247+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

原文地址:https://www.cnblogs.com/xiaochuan94/p/11167822.html

时间: 2024-10-08 12:10:36

LeetCode.1018-可被5整除的二进制数(Binary Prefix Divisible By 5)的相关文章

Leetcode 1018. Binary Prefix Divisible By 5

class Solution: def prefixesDivBy5(self, A: List[int]) -> List[bool]: ans,t = [],0 for a in A: t = (t * 2 + a)%5 ans.append(False if t else True) return ans 原文地址:https://www.cnblogs.com/zywscq/p/10739388.html

Leetcode-1029 Binary Prefix Divisible By 5(可被 5 整除的二进制前缀)

1 class Solution 2 { 3 public: 4 vector<bool> prefixesDivBy5(vector<int>& A) 5 { 6 vector<bool> v(A.size()); 7 int rnt = 0; 8 for(int i = 0; i< A.size();i ++) 9 { 10 if(A[i]==1) 11 { 12 if(rnt==0) 13 {rnt = 1;v[i] = false;} 14 els

【leetcode刷题笔记】Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 题解:递归,树的高度 = max(左子树高度,右子树高度)+1: 代码如下: 1 /** 2 * Definition for binary tree 3 * public cla

[leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree

[leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree 链接 leetcode 描述 ??Given two binary trees original and cloned and given a reference to a node target in the original tree. ??The cloned tree is a copy of the original tr

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

1029. 可被 5 整除的二进制前缀 显示英文描述 我的提交返回竞赛 用户通过次数467 用户尝试次数662 通过次数477 提交次数1964 题目难度Easy 给定由若干 0 和 1 组成的数组 A.我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位). 返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false. 示例 1: 输入:[0,1,1] 输出:[true,

Leetcode 1022. 可被 K 整除的最小整数

1022. 可被 K 整除的最小整数 显示英文描述 我的提交返回竞赛 用户通过次数74 用户尝试次数262 通过次数75 提交次数1115 题目难度Medium 给定正整数 K,你需要找出可以被 K 整除的.仅包含数字 1 的最小正整数 N. 返回 N 的长度.如果不存在这样的 N,就返回 -1. 示例 1: 输入:1 输出:1 解释:最小的答案是 N = 1,其长度为 1. 示例 2: 输入:2 输出:-1 解释:不存在可被 2 整除的正整数 N . 示例 3: 输入:3 输出:3 解释:最小

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

能不能被5整除都看 看输入数字的最后一位是否为 0或者5 也就是最后一位是否能被整除 这道题很容易就溢出 所以我们仅包括最后几位即可 class Solution { public List<Boolean> prefixesDivBy5(int[] A) { List<Boolean> ans = new ArrayList<Boolean>(); int temp = 0 ; for(int i = 0 ; i < A.length ;i++) { temp

Leetcode 1262. 可被三整除的最大和

题目:给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和. 示例 1: 输入:nums = [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和). 这道题是第163周竞赛的一道题目,难度中等,边学别人的解题方法,边记录吧! 方案一.不妨设dp[i] 代表 选取的数字累加和 模3 = i 的数字和 假定nums[i] % 3 = 1 ,那么,和 前面选取的数字和模 3 = 2 的数相加,就可以模3为 0 ,表达起来就是

[LeetCode] Self Dividing Numbers 自整除数字

A self-dividing number is a number that is divisible by every digit it contains. For example, 128 is a self-dividing number because 128 % 1 == 0, 128 % 2 == 0, and 128 % 8 == 0. Also, a self-dividing number is not allowed to contain the digit zero. G