一起养成写作习惯!这是我参与「掘金日新计划 · 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
};
位运算
位运算的逻辑和模拟是一模一样的,只是我们需要去优先了解位运算的一些知识,比如说一个数和另一个数进行按位与,也就是 & ,比方说 2 & 3:
所以我们只要用一个数去和 1 进行相与,就能够得到这个数的二进制最后一位是多少,然后再将这个数进行右移,就能够判断这个数的每一位与 1 进行相与的结果。
并且在我们不断地位移的过程当中,不止是n的最后一位会发生改变,并且输入的n会一直缩小,直到变为0
我们就可以以此为判断循环是否结束。
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;
};