LeetCode 868. 二进制间距(python)

题目链接

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

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

示例 1:

输入:22
输出:2
解释:
22 的二进制是 0b10110 。
在 22 的二进制表示中,有三个 1,组成两对连续的 1 。
第一对连续的 1 中,两个 1 之间的距离为 2 。
第二对连续的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
示例 2:

输入:5
输出:2
解释:
5 的二进制是 0b101 。
示例 3:

输入:6
输出:1
解释:
6 的二进制是 0b110 。
示例 4:

输入:8
输出:0
解释:
8 的二进制是 0b1000 。
在 8 的二进制表示中没有连续的 1,所以返回 0 。

解题思路:
将数字用bin()函数转换成二进制形式(字符形式),遍历字符串,若当前值为1(注意将1用字符形式表示),用find函数分别找其左边的1和右边的1的距离,将当前位置i加一后距离再加一,取两者最大值,与当前最大距离进行比较。

class Solution:
    def binaryGap(self, N: int) -> int:
        s=bin(N)
        mmax=0
        for i in range(len(s)):
            if s[i]=='1':#注意字符形式与整形匹配
                a=max(s[i-1::-1].find('1')+1,s[i+1:].find('1')+1)
                if a>mmax:
                    mmax=a
        return mmax

p.s.别人的做法
用enumerate函数获取二进制字符串的索引和数值,记录最新的‘1’的位置,碰到下一个‘1’时,计算与前一个‘1’的距离,同时将当前‘1’的位置更新。

        max_dis=0
        last_one=None
        for i,n in enumerate(bin(N)[2:]):
            if n=='1':
                if last_one is None:
                    last_one=i
                else:
                    max_dis=max(max_dis,i-last_one)
                    last_one=i
        return max_dis

猜你喜欢

转载自blog.csdn.net/weixin_44740082/article/details/88918474