题目
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2x
,则认为 n
是 2 的幂次方。
思路
简单题直接重拳出击,暴力解就好
(1)小于0的数必不可能是2的次幂,直接返回false;
(2)1比较特殊,单独拿出来判断,n如果为1直接返回true;
(3)当n大于1时,一直进行n=n/2,如果商出现大于1的奇数,说明含有2以外的因子,不是2的次幂,直接返回flase,否则一直进行该操作,直到商出现1跳出循环,此时返回true。
例如:16/2=8,8/2=4,4/2=2,2/2=1,跳出循环,返回true
60/2=30,30/2=15,为大于1的奇数,直接返回false;
当然,也可以是使用递归,逻辑与上述方法相同,但是运行时间较长,不如循环来得实在。
代码
class Solution {
public boolean isPowerOfTwo(int n) {
if(n==1) return true;//
if(n<=0) return false;//负数必然不是2的次幂
while(n>1){
if(n%2==0){
n=n/2;//为偶数,就一直除以2
}else{
return false;//一直除以2的过程中,出现奇数的商,一定不为2的次幂
}
}
return true;
}
}
拓展
本题是2的次幂,那么如果是3的幂,4....k的次幂呢,当然与本题思路相同,只不过将n=n/2变为n=n/k即可,代码如下
class Solution {
public boolean isPowerOfThree(int n,int k) {
if(n==1) return true;//
if(n<=0) return false;//负数必然不是2的次幂
while(n>1){
if(n%k==0){
n=n/k;//一直除以k
}else{
return false;//一直除以k的过程中,出现不为k的商,一定不为k的次幂
}
}
return true;
}
}