❓342. 4的幂
难度:简单
给定一个整数,写一个函数来判断它是否是 4
的幂次方。如果是,返回 true
;否则,返回 false
。
整数 n
是 4
的幂次方需满足:存在整数 x
使得
n
=
=
4
x
n == 4^x
n==4x。
示例 1:
输入:n = 16
输出:true
示例 2:
输入:n = 5
输出:false
示例 3:
输入:n = 1
输出:true
提示:
- − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 −231<=n<=231−1
进阶: 你能不使用循环或者递归来完成本题吗?
💡思路:
基础知识必知:一篇文章搞懂位运算
4
的幂次方,说明n
用二进制表示,只有一个1
。
法一:数学
4
的幂次方,一定是4
的倍数,因此可以使用数学除法判断。- 使用 递归 迭代判断。
法二:循环
- 使用位运算中的 右移操作,循环判断
n
是否是4
的幂次方。n
和3
(11
) 按位与,如果不为0
则一定不是4
的幂。
法三:位运算
- 使用位运算
n & (n - 1)
的性质去掉最后一个1 ,判断是否等于0
,等于0
则说明只有一个1
; - 然后在和
0x55555555
(01010101 01010101 01010101 01010101
)按位与,判断是否等于原数,相等则为4
的幂。
🍁代码:(Java、C++)
法一:数学
Java
class Solution {
public boolean isPowerOfFour(int n) {
if(n == 1) return true;
if(n <= 0 || n % 4 != 0) return false;
return isPowerOfFour(n / 4);
}
}
C++
class Solution {
public:
bool isPowerOfFour(int n) {
if(n == 1) return true;
if(n <= 0 || n % 4 != 0) return false;
return isPowerOfFour(n / 4);
}
};
法二:循环
Java
class Solution {
public boolean isPowerOfFour(int n) {
if(n <= 0) return false;
while(n > 1){
if((n & 3) != 0) return false;
n >>>= 2;
}
return true;
}
}
C++
class Solution {
public:
bool isPowerOfFour(int n) {
if(n <= 0) return false;
while(n > 1){
if((n & 3) != 0) return false;
n >>= 2;
}
return true;
}
};
法三:位运算
Java
class Solution {
public boolean isPowerOfFour(int n) {
if(n <= 0) return false;
return (n & (n - 1)) == 0 && (n & 0x55555555) == n;
}
}
C++
class Solution {
public:
bool isPowerOfFour(int n) {
if(n <= 0) return false;
return (n & (n - 1)) == 0 && (n & 0x55555555) == n;
}
};
🚀 运行结果:
🕔 复杂度分析:
- 时间复杂度: O ( 1 ) O(1) O(1)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!