题目
难度:★☆☆☆☆
类型:数学
给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。
如果没有两个连续的 1,返回 0 。
提示
1 <= N <= 10^9
示例
示例 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 。
解答
我们可以首先找到“1”在二进制值数字中出现的所有位置,如果“1”没有出现过,或者仅出现一次,那么一与一之间的最长距离就是零;如果出现超过一个“1”,那么比较相邻“1”之间的距离,取距离最大的返回。
class Solution:
def binaryGap(self, N):
"""
:param N: int
:return: int
"""
bin_N = bin(N)[2:] # 二进制形式
indexes = [i for i, b in enumerate(bin_N) if b == '1'] # 1出现的所有位置
if len(indexes) <= 1: # 如果出现不超过1次
return 0 # 返回零
else: # 否则返回最大差值
return max([indexes[i+1]-indexes[i] for i in range(len(indexes)-1)])
有基础的同学可以写成下面的紧凑写法:
class Solution:
def binaryGap(self, N):
indexes = [i for i, b in enumerate(bin(N)[2:]) if b == '1'] # 1出现的所有位置
return max([indexes[i+1]-indexes[i] for i in range(len(indexes)-1)]) if len(indexes) > 1 else 0
如有疑问或建议,欢迎评论区留言~