题目描述
给定一个正整数 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" 。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-gap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
看到这题就想着通过双“指针”,其实不是指针,只是标识位置的两个int型变量,让列表中存储的二进制序列从头(高位)往后(低位)依次扫描,遇到二进制 '1',则给i赋值为j,给j赋值为k,意思是一个指针j指向后面相邻的' 1' ,一个指针i指向当前的'1',还有一个k用于列表的遍历,记录当前位置下标。因为初始化时i,j,k都是0,遇到1之后,会让i=j,j=k,通过k不停的往后走,i会接替它的相邻的1即j的位置,而j也变为了新的1的位置k,这样就保证了i,j永远指向的是相邻的两个1,把j-i的值存入ans列表中,待循环结束,返回ans的最大值即可。
注:
1:可以把一个数的二进制形式放入一个列表中,这样会把二进制的01作为字符‘0’‘1’存入一个列表,而且会把‘0b’表示二进制的格式也存入,所以需要对这个列表进行截断前两个位置的处理。
2:因为一个数的二进制表示,它的最高位一定是1,因为不会有多余的用不到的0放在高位,所以这个思路就可以通过,如果高位还有冗余的0,比如输入0100==4的二进制,这个思路就不满足题意了。好在二进制表示4时-->4==0b100
代码
class Solution:
def binaryGap(self, n: int) -> int:
ls=list(bin(n))
ls=ls[2::]
ans=[]
size=len(ls)
i,j,k=0,0,0
while k<size:
if ls[k]>'0':
i=j
j=k
ans.append(j-i)
k+=1
return max(ans)