题目:
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,列出来直接查找……