【刷题日记】693. 交替位二进制数

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

【刷题日记】693. 交替位二进制数

本次刷题日记的第 16 篇,力扣题为:67. 二进制求和简单

一、题目描述:

下班回来瞅一眼力扣题,咱们顺手给他写了吧,保持良好的习惯,毕竟现在已经算是在赶作业了

看这个题要求还是非常明确的,又是一个处理二进制的题目,我们一起来看看吧

二、思路分析:

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

这道题给出了哪些重点信息呢:

  • 题目给出的数据是一个正整数, 咱们处理起来就不需要考虑负数的情况
  • 我们需要知道如何将整数转换成二进制,才能更好的处理这个题,如果是负数的话,我们还要处理高位补 1 的事情,不过这道题不需要

关于进制的题,我们都要想到辗转相除法,这是咱们小学的时候就学过的数学方法,现在来做编程题,很多都是数学思想,学好数学走遍天下

用题目中给出的示例,推演一下: n=11 的时候

  • 11 除以 2 ,商 5 , 余数为 1
  • 5 除以 2 ,商 2 ,余数为 1
  • 2 除以 2 ,商 1 ,余数为 0
  • 1 除以 2 ,商 0 ,余数为 1
  • 则 11 的二进制就是 1011

根据题中示意,需要二进制数,相邻两个数字不能是相等的,非 0 即 1

则我们不仅要能算出二进制数,还需要筛选,那么问题咱们就可以转化成辗转相除法每一次的余数,是否和上一次的余数相等

若相等,则不符合题意,若辗转到商 0 的时候,余数也与上一次余数不相等,则该数是符合题意的

接下来咱们就可以来翻译成代码了

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

func hasAlternatingBits(n int) bool {
 // 将入参给到临时变量,我们的编码原则是不能改变入参
 tmp := n
// 默认上一次余数为 2 ,因为咱们第一次辗转相除的时候,余数一定不可能是 2 ,所以第一次肯定不会等于 2 ,或者可以将 pre 赋值给大于 2 的数字也是可以的
 for pre := 2; tmp != 0; tmp /= 2 {
        yushu := tmp % 2
     // 校验本次的余数和上一次的余数是否相等
        if yushu == pre {
            return false
        }
     // 对上一次的余数进行赋值
        pre = yushu
    }
    return true

}
复制代码

看了上述编码后就知道这个题还是非常简单的,但是思想也是相当重要的,无论做什么事情,基础要牢固

四、总结:

该题的时间复杂度,可不是 O(n) 哦,他是 O(logn) , 因为我们的循环次数是整数转成二进制数的位数, 空间复杂度是 O(1)

原题地址:693. 交替位二进制数

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

猜你喜欢

转载自juejin.im/post/7080159062620373006