【刷题日记】868. 二进制间距

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

【刷题日记】868. 二进制间距

本次刷题日记的第 44 篇,力扣题为:868. 二进制间距简单

一、题目描述:

来抽时间做一个二进制嘞的题目,犹记得做二进制题的时候,还是刚学编程日子

或许在学数字电路的时候,对于二进制应该也是不陌生的,哈,一看就是一个学通信或者电子信息的新时代的打工人

二、这道题考察了什么思想?你的思路是什么?

我们一起来瞅瞅这个题都需要我们完成哪些事情,或者说是有哪些细节需要我们知道:

  • 题目给出一个整数,需要我们自行转成二进制数
  • 通过计算出来的二进制数,找到该二进制数中 1 和 1 之间最大的距离是多少,且这里要注意, 1 和 1 之间要是相邻的我们才会计算距离,最后才会看是否符合放到结果中

简单分析和记录一下,对于一个数转换成二进制的数的过程在这里就不赘述了,默认我们已经可以将数转换成二进制数了

当拿到二进制数的时候,我们看如何处理?

例如上述的 1 个 二进制,我们知道结果肯定是红框中的相邻两个 1 的距离,才是本题的答案, 为 3

那么我们可以这样来找:

  • 遍历这个二进制数,不停的将该二进制数按位右移动,并记录当前数字最低位上的 1 的位置
  • 遍历过程中,动态的更新和计算 当前 1 的位置和上一个 1 的位置的距离,最终比较大小即可

这么看来,思路是不是很明确了,剩下的就来实现编码吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,这里需要注意的是,我们需要定义一个变量来动态的记录遍历过程中的上一个 1 的位置,便于计算距离和比较结果

func binaryGap(n int) (ans int) {

    // 定义一个变量记录上一次 1 的位置
    pre := -1
    for i := 0; n > 0; i++ {
        if n&1 == 1 {
            if pre != -1 {
                // 计算当前 1 的位置和上一次 1 的位置的差,并和之前的结果比较,取最大值
                ans = max(ans, i-pre)
            }
            pre = i
        }
        n >>= 1
    }
    return
}

// 帮助函数 返回一个更大的值
func max(a, b int) int {
    if b > a {
        return b
    }
    return a
}
复制代码

按照如上编码,我们就能够很清晰的看出来,从上一个 1 到 下一个 1 清晰的计算过程了

四、总结:

就如上的编码实现方式来看,时间复杂度是多少嘞

要明白,咱们一个数字向右按位移动 1 位,实际上就是除以 2 ,那么一个数字不停的除以 2, 就相当于一个数字不停的向右按位移,根据我们已学过的知识,时间复杂度就是 O(log n)

空间复杂度是多少呢?

我们引入的是一些常数级别的空间消耗,这个很明显,这里的空间复杂度是 O(1)

原题地址:868. 二进制间距

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

猜你喜欢

转载自juejin.im/post/7090923534309916685