二進制中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;
}
};