一、题目描述
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/po…
示例 1:
输入:n = 1 输出:true 解释:20 = 1
示例 2:
输入:n = 16 输出:true 解释:24 = 16
示例 3:
输入:n = 3 输出:false
示例 4:
输入:n = 4 输出:true
示例 5:
输入:n = 5 输出:false
二、解法
2.1 循环
采用循环的方式,来依次将这个数据 %2 直到n等于1为止
class Solution {
public boolean isPowerOfTwo(int n) {
while(n > 1) {
if(n % 2 == 1) {
return false;
}
n /= 2;
}
if(n == 1) {
return true;
}
return false;
}
}
2.2 递归
采用递归的方式,将大问题化为小问题来进行求解
① 递归的结束条件
- n == 0 return false
- n == 1 return true ② 子问题
- if(n % 2 != 0) return false
- 继续判断: n / 2
class Solution {
public boolean isPowerOfTwo(int n) {
if(n == 1) {
return true;
}
if(n == 0) {
return false;
}
if(n % 2 != 0) {
return false;
}
return isPowerOfTwo(n/2);
}
}
2.3 位运算
对于2的幂次方而言, 都是 10000...000, n个0
当它减去1后,这个数将会变成 1111.....111, n-1个1
它们进行 &运算,结果将会变为0。
也就是,令 n & (n - 1),如果结果是0,说明是2的幂次方。
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
三、相似题目
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/po…
题目分析
首先4的幂次方一定是2的幂次方n & (n - 1) == 0,其次4的幂次方满足n % 3 == 1,满足这两种条件说明是4的幂次方。
代码
class Solution {
public boolean isPowerOfFour(int n) {
return (n > 0) && ((n & (n-1)) == 0) && (n % 3 == 1);
}
}