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