一起养成写作习惯!这是我参与「掘金日新计划 · 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. 二进制间距
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~