leetcode-868-Binary Gap

本文介绍了一种高效算法,用于找出一个正整数N的二进制表示中两个连续1之间的最大距离。通过位操作技巧,文章提供的C++实现仅需4ms,击败了99.64%的提交。

题目描述:

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

 

要完成的函数:

int binaryGap(int N) 

 

说明:

1、这道题给定一个整数N,要求在N的二进制表示中找到两个连续的1(中间可以包含0),比如22的二进制表示10110中,第一位的1和第三位的1是两个连续的1,第三位的1和第四位的1是两个连续的1。

要求找到两个连续的1的最长距离,返回该距离。

2、这道题很容易,由于整数N在计算机中就是以二进制存储的,所以我们进行位操作,读取出1的位置进行计算。

代码如下:(附详解)

    int binaryGap(int N) 
    {
        int i,j,count=0,res=0;
        while(N)//读取出第一个1的位置(从后面读起),存储在i中
        {
            count++;//count表示当前处理的是哪一位
            if(N&1==1)
            {
                i=count;
                N>>=1;
                break;
            }
            N>>=1;//N不断右移
        }
        while(N)//读取所有1的位置
        {
            count++;
            if(N&1==1)
            {
                j=count;//把新的1的位置记录在j中
                res=max(res,j-i);//更新res值,存储最长的距离
                i=j;//更新i值到当前位置
            }
            N>>=1;//N不断右移
        }
        return res;
    }

上述代码实测4ms,beats 99.64% of cpp submissions。

转载于:https://www.cnblogs.com/chenjx85/p/9332944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值