【LeetCode】693. 交替位二进制数

780 阅读2分钟

image.png

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 题目给出是一个十进制的正整数
    • 要求对正整数的二进制,0和1交替情况
    • 如果二进制相邻数组的是相同的,则返回False

二、思路分析:

我们拿到本题,与我们昨天做67. 二进制求和 关于二进制的题类似,思路如下:

  • 首先对十进制整数转换成2进制形式
  • 将二进制转换成字符串
  • 使用for循环对二进制字符串进行遍历判断
  • 如果当Bin[i-1]和Bin[i]相等时,则直接返回False。

对于十进制转换成二进制,我们先来看一下转换原理。例如5-->二进制 101

image.png

按照如上思路,我们写出了十进制转换二进制

S = ""
while n :
    pre = n%2
    S = S + str(pre)
    n = n/2
print(S[::-1])

十进制转换为二进制,我们也可以直接使用python bin() 方法进行直接转换

好呐,经过以上转换,我们求出了二进制。然后进行遍历字符比对,完整代码如下:

class Solution(object):
    def hasAlternatingBits(self, n):
        """
        :type n: int
        :rtype: bool
        """
        B = bin(n)

        for i in range(1,len(str(B))):

            if B[i-1] == B[i] :

                return False

        return True

我们发现使用for循环,时间复杂度为O(n),可以进行优化。直接在转换二进制的时候进行判断,代码如下:

时间复杂度O(logn),空间复杂度O(1)

class Solution(object):
    def hasAlternatingBits(self, n):
        """
        :type n: int
        :rtype: bool
        """
        tmp = 2
        while n :

            pre = n%2
            if tmp == pre:
                return False
            tmp = pre
            n = n/2

        return True

相比以上方法,最快还是进行位运算,空间复杂度直接可以为O(1).

a = n ^ (n >> 1)
return a & (a + 1) == 0

三、总结:

本题,我们采用第一种方法提交的AC记录如下: image.png

进制位计算的题目,我们可以使用字符串的形式去解决。

以上是本期内容,欢迎大佬们点赞评论,下期见~~