leetcode 算法题868 (简单226) 二进制间距

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/FYuu95100/article/details/102711271

leetcode 算法题868 (简单226) 二进制间距

  • 题目介绍
给定一个正整数 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 <= N <= 10^9

  • 解法一
/**
 * @param {number} N
 * @return {number}
 */
var binaryGap = function(N) {
    let str = N.toString(2), max = 0, count = i = 1;
    while(i < str.length) {
      if(str[i++] === '0') {
        count++;
      } else {
        max = Math.max(count, max);
        count = 1;
      }
    }
    return max;
};

执行用时 : 104 ms, 在所有 JavaScript 提交中击败了16.87%的用户

内存消耗 : 33.9 MB, 在所有 JavaScript 提交中击败了17.39%的用户

  • 解法二
/**
 * @param {number} N
 * @return {number}
 */
var binaryGap = function(N) {
  if(!(N & (N - 1))) {
    return 0;
  }
  while(!(N & 1)) {
    N = N >> 1;
  }
  let count = max = 1;
  N = N >> 1;
  while(N) {
    if(N & 1) {
      max = Math.max(max, count);
      count = 1;
    } else {
      count++;
    }
    N = N >> 1;
  }
  return max;
};

执行用时 : 72 ms, 在所有 JavaScript 提交中击败了93.98%的用户

内存消耗 : 33.7 MB, 在所有 JavaScript 提交中击败了43.48%的用户

猜你喜欢

转载自blog.csdn.net/FYuu95100/article/details/102711271