Given a positive integer `N`, find and return the longest distance between two consecutive 1's in the binary representation of `N`.

If there aren't two consecutive 1's, return 0.

Example 1:

Input: 22
Output: 2
Explanation:
22 in binary is 0b10110.
In the binary representation of 22, there are three ones, and two consecutive pairs of 1's.
The first consecutive pair of 1's have distance 2.
The second consecutive pair of 1's have distance 1.
The answer is the largest of these two distances, which is 2.

Example 2:

Input: 5
Output: 2
Explanation:
5 in binary is 0b101.

Example 3:

Input: 6
Output: 1
Explanation:
6 in binary is 0b110.

Example 4:

Input: 8
Output: 0
Explanation:
8 in binary is 0b1000.
There aren't any consecutive pairs of 1's in the binary representation of 8, so we return 0.

Note:

  • 1 <= N <= 10^9

这道题给了我们一个正整数,问其二进制表示数中两个 '1' 之间的最大距离是多少。比如整数 22 的二进制为 10110,那么可以看出前两个 '1' 之间的距离最大,所以返回2即可。其实这道题的考察点就是如何按位取数,对一个二进制数直接与 '1',就可以提取出最低位,然后和0比较大小,就知道最低位是0还是1了。当然为了每一位的是0还是1,一般有两种处理方法,一种是直接将原数字右移一位,则之前的最低位被移除了,再和 '1' 相与即可,直到原数字变为0停止。另一种方法是直接右移固定的位数再与 '1',因为整型数只有 32 位,所以可以直接取出任意位上的数字。那么既然要求两个 '1' 之间的最大距离,那么只要关心 '1' 的位置即可,一种比较直接的思路就是先遍历一遍各位上的数字,将所有 '1' 的坐标位置都保存到一个数组 pos 之中,然后再遍历这个 pos 数组,计算相邻两个数字的差,即两个 '1' 之间的距离,更新结果 res 即可得到最大距离,参见代码如下:


解法一:

class Solution {
public:
int binaryGap(int N) {
vector<int> pos;
for (int i = 0; i < 32; ++i) {
if (((N >> i) & 1) != 0) pos.push_back(i);
}
int res = 0, n = pos.size();
for (int i = 1; i < n; ++i) {
res = max(res, pos[i] - pos[i - 1]);
}
return res;
}
};

我们也可以只用一个循环来完成,而且不用 pos 数组,只用一个变量 last 来记录上一个遍历到的 '1' 的位置,初始化为 -1。那么在遍历的过程中,若遇到了 '1',则判断 last 是否大于等于0,是的话则表示之前已经遇到了 '1',那么当前位置i减去 last,即为两个 '1' 之间的距离,用来更新结果 res,然后再更新 last 为当前位置i,继续遍历即可,参见代码如下:


解法二:

class Solution {
public:
int binaryGap(int N) {
int res = 0, last = -1;
for (int i = 0; i < 32; ++i) {
if (((N >> i) & 1) != 0) {
if (last >= 0) res = max(res, i - last);
last = i;
}
}
return res;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/868

参考资料:

https://leetcode.com/problems/binary-gap/

https://leetcode.com/problems/binary-gap/discuss/149945/Simple-Java-(10-ms)

https://leetcode.com/problems/binary-gap/discuss/149835/C%2B%2BJavaPython-Dividing-by-2

[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)

[LeetCode] Binary Gap 二进制间隙的更多相关文章

  1. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  2. Binary Gap(二进制空白)

    中文标题[二进制空白] 英文描述 A binary gap within a positive integer N is any maximal sequence of consecutive zer ...

  3. LeetCode & Binary Search 解题模版

    LeetCode & Binary Search 解题模版 In computer science, binary search, also known as half-interval se ...

  4. LeetCode:Binary Tree Level Order Traversal I II

    LeetCode:Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of ...

  5. LeetCode: Binary Tree Traversal

    LeetCode: Binary Tree Traversal 题目:树的先序和后序. 后序地址:https://oj.leetcode.com/problems/binary-tree-postor ...

  6. [LeetCode] Binary Search 二分搜索法

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  7. 【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】

    [067-Add Binary(二进制加法)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given two binary strings, return thei ...

  8. 【Leetcode_easy】868. Binary Gap

    problem 868. Binary Gap solution1: class Solution { public: int binaryGap(int N) { ; vector<int&g ...

  9. LeetCode Binary Search All In One

    LeetCode Binary Search All In One Binary Search 二分查找算法 https://leetcode-cn.com/problems/binary-searc ...

随机推荐

  1. [转] 图解Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention

    from : https://caicai.science/2018/10/06/attention%E6%80%BB%E8%A7%88/ 一.Seq2Seq 模型 1. 简介 Sequence-to ...

  2. 2018-2019-2 20165325 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165325 <网络对抗技术> Exp6 信息搜集与漏洞扫描 实验内容(概要) 1 各种搜索技巧的应用: 2 DNS IP注册信息的查询: 3 基本的扫描技术 ...

  3. VGG16 ReNetInception network

    VGG16就是运用很简单的2个filter s=2 f=2 的pool以及3x3 same padding的filter. 每pool一下以后 翻倍filter的depth Resnet就是跳级传播结 ...

  4. day07 数据类型间的相互转化及字符编码

    今日内容: 字符间的相互转化 字符编码 今日重点: 字符间的相互转化 """ 字符间的相互转化: """ """ ...

  5. HTTP协议详解(二)

    接着第一篇学习.... 5 头域(首部) 每个头域由一个域名,冒号(:)和域值三部分组成.域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表 ...

  6. selenium启动报错“ incorrect JSON status mapping for 'unknown error' (500 expected)”

    前面讲了工程启动报错“selenium启动报错Unable to read VR Path Registry from C:\Users\clinva\AppData\Local\openvr\ope ...

  7. 浅谈《Linux就该这么学》

    就在去年十月份的时候,偶尔在Linux技术群了看到别人分享的<Linux就该这么学>,好奇的就点进去看看,当时看完首页,突然发现刘遄老师说到心坎里去了,于是就仔细看了看红帽认证的讲解以及后 ...

  8. Uni-app中Class绑定与Style绑定

    为了节约性能,我们将Class与Style的表达式通过compiler硬编码到uni-app中 支持语法和转换效果如下: Class支持语法: <view :class="{ acti ...

  9. java爬虫实现爬取百度风云榜Top10

    最近在项目中遇到了java和python爬虫进行程序调用和接口对接的问题, 刚开始也是调试了好久才得出点门道. 而后,自己也发现了爬虫的好玩之处,边想着用java来写个爬虫玩玩,虽说是个不起眼的dem ...

  10. Oracle数据库体系结构之进程结构(4)

    Oracle进程结构包括用户进程,服务进程,后台进程. 1. 用户进程 用户进程在数据库用户要求连接到Oracle服务器时开始启动. 用户进程是要求Oracle服务器交互的一种进程 它必须首先建立一个 ...