• LeetCode.868-二进制距离(Binary Gap)


    这是悦乐书的第333次更新,第357篇原创

    01看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第203题(顺位题号是868)。给定正整数N,找到并返回N的二进制表示中两个连续1之间的最长距离。如果没有连续两个1,则返回0。例如:

    输入:22
    输出:2
    说明:22的二进制是10110。在22的二进制表示中,有三个1,第一对连续的1距离为2,第二对1的距离为1,答案是这两个距离中最大的一个,即2。


    输入:5
    输出:2
    说明:5的二进制是101。


    输入:6
    输出:1
    说明:6的二进制是110。


    输入:8
    输出:0
    说明:8的二进制是1000。在二进制表示为8时没有任何连续的1,所以我们返回0。

    注意

    • 1 <= N <= 10 ^ 9

    02 第一种解法

    题目的意思是计算一个二进制数中每对1的最长距离,若是只有一个1,距离则为0。

    因此,我们先将N转为一个二进制字符串,然后去遍历字符串中的字符,使用一个临时变量存储前一个1的索引值,遇到新的1时就计算彼此之间的距离,取最大值,最后输出距离。

    public int binaryGap(int N) {
        String str = Integer.toBinaryString(N);
        int prev = -1, distance = 0;
        for (int i=0; i<str.length(); i++) {
            if (str.charAt(i) == '1') {
                if (prev == -1) {
                    prev = i;
                } else {
                    distance = Math.max(distance, i-prev);
                    prev = i;
                }
            }
        }
        return distance;
    }
    

    03 第二种解法

    如果不借助包装类Integer的转换二进制字符串方法,还有其他方式可以解吗?

    可以,使用位运算即可。

    使用右移位运算,可以得到其二进制数最后一位数,判断是1还是0,可以使用与运算,与运算的规则是相同位上为1就为1,0&1 = 0,1&1=1。剩下的就是计算最长距离了,还是使用一个临时变量存储前一次的1,最后输出最长距离。

    public int binaryGap(int N) {
        int prev = -1, distance = 0;
        for (int i=0; i<32; i++) {
            if (((N>>i)&1) == 1) {
                if (prev != -1) {
                    distance = Math.max(distance, i-prev);
                }
                prev = i;
            }
        }
        return distance;
    }
    

    04 第三种解法

    和上面第二种解法一样的思路,只是将右移位运算、与运算拆分成两步来完成,循环也换成了while循环,其他处理思路没变。

    public int binaryGap(int N) {
        int prev = -1, distance = 0, i = 0;
        while (N != 0) {
            if ((N&1) == 1) {
                if (prev != -1) {
                    distance = Math.max(distance, i-prev);
                }
                prev = i;
            }
            i++;
            N >>= 1;
        }
        return distance;
    }
    

    05 小结

    算法专题目前已连续日更超过六个月,算法题文章203+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    parent
    「百度一下,你就知道。总结一下,才是你的。」写出我心(三十九)
    「靠自己」​​​​​​​​​​写出我心(五十二)
    bat方式备份文件并删除历史备份
    「利用思维导图做读书笔记」​​​​​​​​​写出我心(五十一)
    「讨厌的事情放在第一位」写出我心(五十)
    「​学会控制自己的情绪」写出我心(四十九)
    「跑步」写出我心(四十八)
    ​​​​​​「番茄工作法」写出我心(四十七)
    「学好英语的重要性」​​​​写出我心(四十六)
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10860252.html
Copyright © 2020-2023  润新知