LeetCode破解之二进制间距

129 阅读3分钟

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

题目描述

给定一个正整数 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 。

简单模拟+贪心

思路很简单:首先需要不断的移位,cnt就是计数器,同时也表示当前的位置。
第一次遇到1则记录begin为当前位置,表示这一次的起始位置,然后继续移位
再次遇到1就用当前位置减去记录的起始位置(cnt-begin)然后新的起点就是当前位置,继续找下一个1。如此往复,就能得到答案。具体实现步骤如下:

- gap表距离,index表示下标,temp表示上一次1位置的坐标,cou表计数器;
- 第一次遍历遇到1时,没有1的坐标值,所以进不到if循环;
- 所以定义一个计数机cou,表示第二次才能进入if循环,temp记录上一次1位置的坐标;
- 记录下第一个1位置temp后,之后每次遍历到1的位置和上一次1的位置距离通过if里面的语句保留;
class Solution {
    public int binaryGap(int N) {
       int max = 0;
        int temp =-1;
        while(N!=0) {
            if(temp>=0) {
                ++temp;
            }
            if((N&1)==1) {
                max=Math.max(max, temp);
                temp=0;
            }
            N=N>>1;
        }
        return max;
    }
}

注意点

有一说一,这个题目不说人话,非搞个相邻1的距离,仔细想想啥时相邻呢?还不就是被0隔开的1嘛,那最长距离,不就是求最长连续的0的个数 么?所以翻译成人话,就是求二进制中最长连续0的个个数,当然最终结果是0的个数加2,但本质上是求最长连续0的个数。鉴于题目说的不清不楚,这里给3个提示帮助理解:

  1. N - 1 & N会把二进制中最后一个1消除
  2. 将一个二进制数从右往左(从0开始)第x位上的1变为零,与原数的差值为2的x次方
  3. 2的x次方除以2的y次方得数为2的x-y次方,结合第二条,x-y就是两个1之间的距离