每日一题 leetcode231
上图!
二话不说,我直接重拳出击!
class Solution {
public boolean isPowerOfTwo(int n) {
int res = 0;
while(n > 0){
if((n & 1) == 1){
res++;
}
n >>= 1;
}
return (res == 1);
}
}
win + R 打开窗口输入calc 进入程序员模式 输入任何2的幂的数在二进制中都是只有 一个 ‘ 1 ’ 的,所以直接对整数n进行移位与位与操作。
官方正解 :
官方解释的很清楚,这里也不再赘述。
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & -n) == n;
}
}
这里的时间复杂度和空间复杂度都是O(1),显然官方答案更优。
方法二
根据题目“钻空子”
class Solution {
static final int BIG = 1 << 30;
public boolean isPowerOfTwo(int n) {
return n > 0 && BIG % n == 0;
}
}
下面还有一种钻空子的方法,但不是官方的。
class Solution {
public boolean isPowerOfTwo(int n) {
switch (n) {
case 1:
case 2:
case 4:
case 8:
case 16:
case 32:
case 64:
case 128:
case 256:
case 512:
case 1024:
case 2048:
case 4096:
case 8192:
case 16384:
case 32768:
case 65536:
case 131072:
case 262144:
case 524288:
case 1048576:
case 2097152:
case 4194304:
case 8388608:
case 16777216:
case 33554432:
case 67108864:
case 134217728:
case 268435456:
case 536870912:
case 1073741824:
return true;
}
return false;
}
}
时间复杂度都是O(1) hhhhhhh