【LeetCode】868. 二进制间距

117 阅读2分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题给出一个整数参数n,范围在1~10^9

二、思路分析:

我们读取本题内容,题意要求对整数n的二进制相邻1之间最长距离,比如"1001" 中的两个 1 的距离为 3。

按照我们之前已经刷过关于进制转换的,对参数整数n可以轻而易举的转换成二进制。

  • 方法一: 模拟方法

  • 因此,我们可以使用模拟方法解答该题,思路如下:

    • 首先使用 n mod 2 对整数n,转换成二进制 tmp 字符串
    • 使用双指针方法,对得到二进制 tmp 字符串进行判断
    • 当 tmp[left] != "1" 时,则left = left + 1
    • 当 tmp[right] == "1" 时,则求出相邻 1 的距离,并且赋值到ans = max(ans,l),并把left指针移到right指针位置
    • 将right指针继续向前移动+1位置

    image.png

    class Solution(object):
        def binaryGap(self, n):
            """
            :type n: int
            :rtype: int
            """
            tmp = ""
            while n:
    
                pre = n % 2
                tmp = tmp + str(pre)
                n = n / 2    
            ans = 0
            left = 0
            right = 1
            while right < len(tmp):
    
                if tmp[left] != "1":
    
                    left = left + 1
    
                if tmp[right] == "1":
    
                    l = right - left
                    ans = max(ans,l)
                    left = right
    
                right = right + 1
            return ans
    
    
  • 方法二:位运算

    • 本题还可以直接使用 n & 1 位运算,循环求出最低位,判断其是否为1
    • 定义一个变量last 记录1的位置,当前第i位找到1时,则更新ans = max(ans,i-last),再将last更新为i
    • 将 n 进行右移位 1, n = n >> 1,i继续加1
    class Solution(object):
        def binaryGap(self, n):
            """
            :type n: int
            :rtype: int
            """
            last,i,ans = -1,0,0
            while n:
                if n & 1:
                    if last != -1:
                        ans = max(ans,i-last)               
                    last = i
                n = n >> 1
                i = i + 1       
            return ans
    

三、总结:

本题考察的是二进制字符串的处理,本题使用双指针方法,AC记录如下:

image.png

时间复杂度O(nlogn)

空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~