这道题目是要求判断一个数是不是2的指数。
一开始的想法比较简单,把小于等于这个数的2的指数逐步计算出来,然后每次判断2的指数和这个数是不是相等,如果到最后2的指数大于这个数字的时候还没有相等的情况,那么这个数字就不是2的指数。当然这种方法非常耗费时间,所以在LeetCode上面的得到的是Time Limit Exceeded。
public class Solution {
public boolean isPowerOfTwo(int n) {
// Corner cases
if(n == 0){
return false;
}
if(n == 1){
return true;
}
int power = 1;
while(power <= n){
if(power == n){
return true;
}
power *= 2;
}
return false;
}
}
后来看了其他人的解法,才发现还有更好的使用BIt Manipulation的解法。既然是与2的指数有关,我们可以思考一下二进制的情况:如果一个数是2的指数,那么可以确定的是它的二进制表示是只有在最高位是1,其他的位都是0,所以可以利用这一特性。如果n & (n - 1) == 0,那么可以确定这个数的二进制表示是100000000,也就是2的指数。当然也要考虑corner case,比如说输入的数字是0或者负数的情况,在那种情况下并不是2的指数。代码如下,非常简洁,只有一行:
public class Solution{
public boolean isPowerOfTwo(int n){
return ((n > 0) && (n & (n - 1) == 0));
}
}
思考:
1. 遇到与2,2的指数相关的问题可以多考虑一下二进制对题目的解法是否有用。