342. 4的幂
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
示例 1:
输入:n = 16
输出:true
示例 2:
输入:n = 5
输出:false
示例 3:
输入:n = 1
输出:true
提示:
-231 <= n <= 231 - 1
进阶:
你能不使用循环或者递归来完成本题吗?
题解:
同昨天2的幂一样,方法有很多,我们可以直接循环遍历x,也可以从位的角度遍历,注意4的幂时其实就是奇数位为1即可,且只有一个1(如方法一)。
方法二即我们根据位运算的性质,获得一个含有特征位的0101…0100的数,接着我们先判断出n是否是2的幂,判断出来后利用它与n进行&运算,我们发现若n也是4的幂,则其满足与其&后不为0,否则的话为0.
方法三利用函数,即我们先判断出是2的幂后,我们只要对其求根,证明这个根是2的幂即可。由于我们已经判断出原数是2的幂了,则其开根后只要是整数就可以判断其为4的幂了。
方法四利用特殊性质,即4的幂除以3后恒余1,即4^x = (3+1)x,开括号即为有3x+1 ;
而是2的幂不是4的幂的话,对其分析,其除以2后即为4的幂,所以同4的幂一样有除以3的性质----余数为1,但由于其除以2了,所以最后乘2,所以为1*2=2,所以余数为2。因此根据余数判断即可。
方法一:
java:
class Solution {
public boolean isPowerOfFour(int n) {
int sum1 = 0;
int sum2 = 0;
if(n<0)
return false;
for(int i=0;i<31;i++){
if(((n>>i)&1)==1){
sum1++;
if(i%2==0){
sum2++;
continue;
}
return false;
}
}
if(sum1==1&&sum2==1)
return true;
return false;
}
}
C:
bool isPowerOfFour(int n){
int sum1 = 0;
int sum2 = 0;
if(n<0)
return false;
for(int i=0;i<31;i++){
if(((n>>i)&1)==1){
sum1++;
if(i%2==0){
sum2++;
continue;
}
return false;
}
}
if(sum1==1&&sum2==1)
return true;
return false;
}
方法二:
class Solution {
public:
const int M = pow(2,20)+pow(2,18)+pow(2,16)+pow(2,14)+pow(2,12)+pow(2,10)+pow(2,8)+pow(2,6)+pow(2,4)+pow(2,2)+pow(2,22)+pow(2,24)+pow(2,26)+pow(2,28)+pow(2,30);
bool isPowerOfFour(int n) {
if(n==1)
return 1;
if(n<0 || (n&(-n))!=n){
return 0;
}
return (n&M);
}
};
方法三:
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0 || (n&(n-1))!=0 )
return false;
if(Math.sqrt(n)*Math.sqrt(n)==n){
return true;
}
return false;
}
}
class Solution {
public boolean isPowerOfFour(int n) {
int m = (int)Math.sqrt(n);
if(m>0 && (m&(m-1))==0 && m*m==n)
return true;
return false;
}
}
方法四:
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0 || (n&(n-1))!=0 )
return false;
if(n%3==1)
return true;
return false;
}
}