跳至主要內容

0868. 二进制间距

ITCharge大约 1 分钟

0868. 二进制间距open in new window

  • 标签:位运算
  • 难度:简单

题目链接

题目大意

描述:给定一个正整数 nn

要求:找到并返回 nn 的二进制表示中两个相邻 11 之间的最长距离。如果不存在两个相邻的 11,返回 00

说明

  • 1n1091 \le n \le 10^9

示例

  • 示例 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

解题思路

思路 1:遍历

  1. 将正整数 nn 转为二进制字符串形式 binnbin\underline{}n
  2. 使用变量 prepre 记录二进制字符串中上一个 11 的位置,使用变量 ansans 存储两个相邻 11 之间的最长距离。
  3. 遍历二进制字符串形式 binnbin\underline{}n 的每一位,遇到 11 时判断并更新两个相邻 11 之间的最长距离。
  4. 遍历完返回两个相邻 11 之间的最长距离,即 ansans

思路 1:代码

class Solution:
    def binaryGap(self, n: int) -> int:
        bin_n = bin(n)
        pre, ans = 2, 0
        
        for i in range(2, len(bin_n)):
            if bin_n[i] == '1':
                ans = max(ans, i - pre)
                pre = i
            
        return ans

思路 1:复杂度分析

  • 时间复杂度O(logn)O(\log n)
  • 空间复杂度O(1)O(1)