LeetCode 231. Power of Two

题目

Given an integer, write a function to determine if it is a power of two.

Example 1:

Input: 1
Output: true 
Explanation: 20 = 1

Example 2:

Input: 16
Output: true
Explanation: 24 = 16

Example 3:

Input: 218
Output: false

就在今天被data lab折磨到怀疑智商的时候,遇到了这道题。处理了一天的二进制二的倍数,脑海里第一种想法就是疯狂除2看能不能整除,写出的代码还是不够优雅,看了discussion发现了更好的写法,这里就把更好的写法放在注释里。我这种的时间复杂度是O(n),运行时间0ms,100%,空间O(1),8M,100%:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        while (n / 2) {
            if (n % 2 != 0) {
                return false;
            }
            n /= 2;
        }
        return true;    
        /* while (n % 2) {
            n /= 2;
        }
        return n == 1; */
    }
};

还有一种递归的写法,我懒得自己写了,贴个链接:https://leetcode.com/problems/power-of-two/discuss/63966/4-different-ways-to-solve-Iterative-Recursive-Bit-operation-Math

这里面还提到了位操作的办法。折腾了一天的位操作真的觉得自己的脑子不合适想这种脑筋急转弯。因为2的n次方永远都是最高位为1其他位为0,所以如果减1的话就是最高位为0其他位为1,相当于取complement(本来想写取反但是现在对于complement和negation比较在意所以不确定中文),所以可以相当于是n&(n-1)==0。刚刚本来还在想好像也可以~n == n-1,结果发现~8=--9,才意识到这是用2's complement,并且int是32位的,前面还有很多的0会变成1,所以就会出错。这种写法感觉时空复杂度都是O(1),但是运行起来不如最笨的写法,时间4ms,56.46%,空间8.1M,92%:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        return !(n & (n - 1));
    }
};

顺带连着今天的data lab一起记录一下:

n & (n-1):看power of 2

n & (-n):得n的最低为1的位

 

然后还有一些奇妙操作:

1. 复杂的数学计算,略

2. 直接用bitCount计算二进制中1的个数

3. 32位的int只有31个2的power,列出来直接查找……

以上所有方法都来自于:https://leetcode.com/problems/power-of-two/discuss/63966/4-different-ways-to-solve-Iterative-Recursive-Bit-operation-Math

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值