题目描述:
给定一个正整数 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