[LeetCode]231.給定一個整數,編寫一個函數來判斷它是否是 2 的冪次方。(擴展:給定一個數,判斷它是否是完全平方數)

給定一個整數,編寫一個函數來判斷它是否是 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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章