原創 5.5打卡:劍指 offer兩題:二進制中1的個數/數值的整數次方

二進制中1的個數

題目描述

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。

思路:因爲n&(n-1)每次都消去最右邊的1,最終1全被消去會得到0,所以有幾個1就可以進行幾次n&(n-1)。

class Solution {
public:
     int  NumberOf1(int n) {
         int count = 0;
         while(n!=0)
         {
             count ++;
             n = n&(n - 1);
         }
         return count;
     }
};

數值的整數次方

題目描述

給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。保證base和exponent不同時爲0

思路:

最直觀的想法是,求n次方,就乘n次,那麼時間複雜度是O(n)。進行優化就考慮二分。首先考慮特殊情況,指數爲0,結果必爲1,指數爲1,結果爲當前底數的值。還有就是底數爲負數的情況,以及奇數二分時會多一個數。

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent == 0) return 1;
        if(exponent == 1) return base;
        //之前是遞歸結束的判斷,現在是正文。用一個變量記錄底數是否正負,正的是本身,負的是倒數
        bool isNegative = false;
        if(exponent < 0){
            exponent = -exponent;
            isNegative = true;
        }
        double pow = Power(base*base, exponent / 2);
        if(exponent%2 != 0) pow = pow * base;//當指數是奇數時,二分會多一個數,因此可以在遞歸完成後再乘
        return isNegative ? 1/pow : pow;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章