一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情。
又是因为出去吃饭耽误了小作文,所以我决定在公司午休去写
二进制间距
该题出自力扣的868题 —— 二进制间距【简单题】
审题
给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。
如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。
- 首先题意比较明朗,就是给出一个整数,需要找出该整数的二进制之间,相邻两个1最大的间距
- 整道题的思路是:
- 先把整数转换成二进制位数
- 对二进制数进行遍历,遍历出每一位1的索引下标
- 找出1的最大差值
- 解法:
- 利用Java本身的方法,转换成二进制,因为遍历的方便性,直接转换成String字符串
- 遍历字符串,定义两个初始变量——间距最大值、上一次索引下标
- 判断字符是否 == 1,并且判断是否是初次赋值
- 对比当前坐标和index的最大长度
- 因为这种解法需要每次都需要获取字符串的值,导致性能会低下
- 因此可以相对优化,利用右移和与运算
- 从右边开始遍历,每次右移可以获取到当前的二进制
- 用与运算判断是否为1
- 时间复杂度O(lgn)
- 空间复杂度O(1)
编码
- 判断是否为1
for (int i = 0;i<s.length();i++){
if (s.charAt(i) == '1'){
if (index == -1){
index = i;
continue;
}
max = Math.max(max,i - index);
index = i;
}
}
- 优化后 —— 右移 + 与运算
class Solution {
public int binaryGap(int n) {
String s = Integer.toBinaryString(n);
int max = 0;
int index = -1;
for (int i = s.length() -1;i>=0;i--){
if (((n >> i) &1) == 1){
if (index == -1){
index = i;
continue;
}
max = Math.max(max,index - i);
index = i;
}
}
return max;
}
}