一起养成写作习惯!这是我参与「掘金日新计划 · 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个提示帮助理解:
- N - 1 & N会把二进制中最后一个1消除
- 将一个二进制数从右往左(从0开始)第x位上的1变为零,与原数的差值为2的x次方
- 2的x次方除以2的y次方得数为2的x-y次方,结合第二条,x-y就是两个1之间的距离