算法小知识-----04.25-----二进制间距

197 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
    }
}

image.png