leetcode刷题记录-868. 二进制间距

128 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

前言

今天的题目为简单,在不懂运算的时候,通过转化为字符串也能够做出这道题来,但是感觉还是需要动一下位运算的一些基本语法,也可以用在日常业务的一个逻辑判断上面。

每日一题

今天的题目是 868. 二进制间距,难度为简单

  • 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。

  • 如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。

 

示例 1:

输入:n = 22
输出:2
解释:22 的二进制是 "10110" 。
在 22 的二进制表示中,有三个 1,组成两对相邻的 1 。
第一对相邻的 1 中,两个 1 之间的距离为 2 。
第二对相邻的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2

示例 2:

输入:n = 8
输出:0
解释:8 的二进制是 "1000" 。
在 8 的二进制表示中没有相邻的两个 1,所以返回 0

示例 3:

输入:n = 5
输出:2
解释:5 的二进制是 "101"

 

提示:

  • 1 <= n <= 109

题解

简单模拟

字符串的 toString 方法简直压倒一堆简单的二进制题目,直接暴力转为字符串进行处理,就会变得十分简单。

题目需要我们统计最大的两个1之间的距离,使用 toString 方法能够将数组转为二进制的字符串,这样我们就能够遍历字符串,去统计下数字 1 或者 数字 0 的出现。可以设定一个参数用来统计出现的次数,出现为 0 则一直递增,知道出现为 1 就清零。

/**
 * @param {number} n
 * @return {number}
 */
var binaryGap = function(n) {
    let res = 0;
    let two = n.toString(2)
    let maxLen = 0 
    for(let i=1;i<two.length;i++){
        if(two[i] == '1'){
            maxLen++
            res = Math.max(maxLen,res)
            maxLen = 0
        }else{
            maxLen++
        }
    }
    return res
};

image.png

位运算

位运算的逻辑和模拟是一模一样的,只是我们需要去优先了解位运算的一些知识,比如说一个数和另一个数进行按位与,也就是 & ,比方说 2 & 3:

image.png

所以我们只要用一个数去和 1 进行相与,就能够得到这个数的二进制最后一位是多少,然后再将这个数进行右移,就能够判断这个数的每一位与 1 进行相与的结果。

并且在我们不断地位移的过程当中,不止是n的最后一位会发生改变,并且输入的n会一直缩小,直到变为0

image.png

我们就可以以此为判断循环是否结束。

var binaryGap = function (n) {
    let last = 1111, ans = 0;
    for (let i = 0; n != 0; ++i) {
        if (n & 1) {
            ans = Math.max(ans, i - last);
            last = i;
        }
        n >>= 1;
    }
    return ans;
};

image.png