LeetCode 868题 二进制间距

题目描述:

给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。 

如果没有两个连续的 1,返回 0 。

示例 : 

输入:22
输出:2
解释:22 的二进制是 0b10110 。在 22 的二进制表示中,有三个 1,组成两对连续的 1 。
第一对连续的 1 中,两个 1 之间的距离为 2 。第二对连续的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
输入:5
输出:2
解释:5 的二进制是 0b101 。
输入:6
输出:1
解释:6 的二进制是 0b110 。
输入:8
输出:0
解释:8 的二进制是 0b1000 。在 8 的二进制表示中没有连续的 1,所以返回 0 。

方法分析:

该题很简单 ,题意也很明确,就是找到两个连续的 1 之间的最长距离。 传入函数的参数为一个十进制的整数,利用js的 toString(x) 函数,我们可以很方便将其转换为 进制字符串形式。在函数中,我们要获得一组相邻的 1 之间的距离,所以需要一个变量来存储上一次获得 1 的位置,\small 本次索引 - 上次索引两次之差即为间距。遍历,得到最大的那一个间距即可。

代码实现:

var binaryGap = function(N) {
  let binaryN = N.toString(2);
  let distance = 0, pre = 0;
  for (let i in binaryN) {
    if(binaryN[i] == 1){
      distance = Math.max(distance,i - pre);
      pre = i;
    }
  }
  return distance;
};

代码解析:

在函数内部,我们首先将其转换为二进制字符串。然后初始化了间距 distance 以及上一次得到值为1的索引 pre;接着遍历字符串,找出值为1的项,得到间距最大的值1对。利用 pre 变量,确保了我们得到的间距是连续成对的1的间距。

该算法的时间复杂度为\small O(n),其中\small n 是二进制字符串的长度。

该算法的空间复杂度为\small O(1)

相关链接:https://leetcode-cn.com/problems/binary-gap/description/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值