7 交替的二进制位 Binary Number with Alternating Bits

题很简单,一眼就知道是关于二进制运算的,而且我在第一时间就发现符合条件的整数,与它的左移1位后的结果相加,除了尾数全为1.十进制考虑的话,即整数n需满足n + (n<<1) = 2^i-1-i//2。
但是实现上有些问题
首先放上失败代码:

class Solution:
   
    def hasAlternatingBits(self, n):
        # Write your code here
        t = (n<<1) + n 
        i = 0
        ass = 0#设置的外部变量, 记录循环结果。其实最好是布尔变量
        for i in range(t): #这里的范围设置有问题,但是暂时不知道如何解决
            if (pow(2,i) -1)-(i%2) == t:
                ass = 1
            else:
                i + 1 
        return ass == 1

小范围内代码无误,但是时间复杂度不过关。难点
1 可以判断某个数是否是2的幂(n /= 2),但是这对于公式(即之前说到的那个规律)是不适用的
2 数学方法上应该有限制某个数 m 使得2^m刚好不大于数字t,但是这个的代码实现又很复杂。这就是典型的“我有一个问题,有一个巧妙的方法去解决,于是我就有了两个问题”
3 如果用二进制考虑的话,“二进制最后一位的0 1 与位数的关系”…好像不难实现…

这里因为题是英文,所以网上没找到合适的代码。又因为解决这个拖了太久,所以准备暂时跳过,留待以后二进制运算熟悉了再解决。

先总结下目前的收获:
1 有个东西需要用循环判断,输出true false,但是不想每次循环都输出一次。这时候就设置外部变量。
就是说假如需要判断杰杰哪一年有女朋友,然后从1到现在250岁开始循环。每年都没有,所以每次都输出一句“杰杰没有女朋友”输出250次。但是这样看那么多遍就很碍眼,只想循环1-250去判断,不想它输出那一句250遍,一遍就够了。
这时候设置外部变量。
2 Python的运算顺序跟我下意识的考虑是不一样的,比如n+n<<1 其实是(n+n)<<1,所以运算的时候不能少加括号。

猜你喜欢

转载自blog.csdn.net/qq_33612402/article/details/86013004