【力扣每日一题】868.二进制间距

这篇博客探讨了如何使用位运算高效地解决一个编程问题:在给定正整数n的二进制表示中,找到两个相邻1之间的最长距离。作者首先展示了Python的解决方案,然后解释了官方提供的Java实现,该实现使用位运算和双指针来优化计算。博客强调了在处理二进制问题时运用位运算的重要性,以提高算法的运行效率。
摘要由CSDN通过智能技术生成
题目描述

给定一个正整数 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 <= 10^9

又是Java语法不过关,只能先用Python水过去了。

class Solution:
    def binaryGap(self, n: int) -> int:
        binNum = bin(n)[2:]
        maxGap = 0
        for i in range(len(binNum)-1):
            for j in range(i+1,len(binNum)):
                if (binNum[j]=="1" and binNum[i]=="1"):
                    maxGap = max(maxGap,j-i)
                    break
        return maxGap

学习学习官方的解法:

官方

位运算,然后双指针。

class Solution {
    public int binaryGap(int n) {
    //左指针 last,右指针 i
        int last = -1,ans = 0;
        for(int i=0;n!=0;++i){
        //取最后一位与1进行按位与,即判断该位是不是1
            if((n&1)==1){
            //last首先要主动赋值一次,才能进行比较
                if(last!=-1) ans = Math.max(ans,i-last); 
                last = i;
            }
            //右移,n二进制表示减去一位
            n >>= 1;
        }
        return ans;
    }
}

注意n&1代表n的二进制表示的最后一位和1按位与,只有最后一位是1的情况下,结果才是1。 n>>1即是n的二进制表示去掉最后一位。


涉及二进制一定要想到位运算,提高运算效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值