美文网首页
LeetCode 二进制间距

LeetCode 二进制间距

作者: 吴敬悦 | 来源:发表于2021-03-07 23:53 被阅读0次

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

    示例 2:

    输入:n = 5
    输出:2
    解释:
    5 的二进制是 "101" 。
    

    示例 3:

    输入:n = 6
    输出:1
    解释:
    6 的二进制是 "110" 。
    

    示例 4:

    输入:n = 8
    输出:0
    解释:
    8 的二进制是 "1000" 。
    在 8 的二进制表示中没有相邻的两个 1,所以返回 0 。
    

    示例 5:

    输入:n = 1
    输出:0
    

    提示:

    • 1 <= N <= 10^9

    我的算法实现为:

    class Solution {
        fun binaryGap(n: Int): Int {
            var max = 0
            var lastIndex = -1
            var currentIndex = 0
            var tempN = n
            while (tempN != 0) {
                val b = tempN % 2
                if (b == 1) {
                    // 由于不知道是不是第一次,所以需要判断一下
                    if (lastIndex != -1) {
                        // 计算两个 1 的距离,然后跟最大距离最对比
                        val a = currentIndex - lastIndex
                        if (a > max) {
                            max = a
                        }
                    }
                    lastIndex = currentIndex
                }
                tempN /= 2
                currentIndex ++
            }
            return max
        }
    }
    

    这种算法的代码量很大,看着就头昏,于是我进行了改进:

    class Solution {
        fun binaryGap(n: Int): Int {
            // 保存最大值
            var max = 0
            // 保存当前进度,也就是两个 1 之间的距离
            var currentIndex = 0
            var tempN = n
            // 先找到第一个有 1 的位置,之所以这样干,主要是保证 currentIndex 一定是从 0 开始
            while (tempN % 2 != 1) {
                tempN /= 2
            }
            // 如果是 1 那么就比较操作,否则进行下一轮比较
            while (tempN != 0) {
                if (tempN % 2 == 1) {
                    max = max.coerceAtLeast(currentIndex)
                    currentIndex = 0
                }
                currentIndex ++
                tempN /= 2
            }
            return max
        }
    

    来源:力扣(LeetCode)

    相关文章

      网友评论

          本文标题:LeetCode 二进制间距

          本文链接:https://www.haomeiwen.com/subject/qpvuqltx.html