給定一個整數,編寫一個函數來判斷它是否是 2 的冪次方。
示例 1:
輸入: 1
輸出: true
解釋: 20 = 1
示例 2:
輸入: 16
輸出: true
解釋: 24 = 16
示例 3:
輸入: 218
輸出: false
思路
1.將數字循環除以2,到最後判斷是餘1還是0,餘1則不是2的冪次方。
public boolean isPowerOfTwo(int n) {
if (n == 0) return false;
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
2.使用位運算,如果n爲2的冪次方,那麼二進制位上只有一位是1,然後n-1變爲原先爲1的位變成0,右邊的所有位變爲1,所以相&後結果爲0,則爲2的冪次方。
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
return (n & (n - 1)) == 0;
}
3.承接思路2,如果n爲2的冪次方,那麼二進制位上只有一位是1,所以用Integer.bitCount(n)統計二進制中1的個數爲1。
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
return Integer.bitCount(n) == 1;
}
擴展
給定一個正整數 num,編寫一個函數,如果 num 是一個完全平方數,則返回 True,否則返回 False。
1.使用二分法找到是否存在一個數乘以自己等於num。
public static boolean isPerfectSquare(int num) {
if (num<2){
return true;
}
//使用int時mid*mid>Integer.MAX_VALUE
long l=2;
long h=num/2;
long mid;
while (l<=h){
mid=(l+h)/2;
if (mid*mid==num){
return true;
}else if (mid*mid<num){
l=mid+1;
}else {
h=mid-1;
}
}
return false;
}