原创 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;
    }
};

 

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