开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!
牛客网-剑指offer
文章目录
1、二进制中1的个数
描述:输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示。
思路:这是一个网友的思路,bingo,棒!
- 如果一个整数不为0,那么这个整数的二进制里面肯定至少有一位为1;
- 如果我们把这个数减去1,那么原来处于整数最右边的1就会变为0,最右边的1后面的所有0都会变为1(最右边的1后面还有0)。其他所有位不会受到影响;
- 下面举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1之后,第三位变为0,它后面两位变为1。而该位之前的那位保持不变,因此结果为1011。
- 我们可以看出:减一的结果就是把最右边的一个1开始往后的所有位都取反。
- 这时候将原来的整数和减去1之后的结果做与运算,会把该整数最右边一个1变成0。那么一个二进制有多少个1,就可以进行多少次这样的操作。
测试代码:
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while (n!=0){
count++;
n = n&(n - 1);
}
return count;
}
};
2、数值的整数次方
描述:给定一个 d o u b l e double double 类型的浮点数 b a s e base base 和 i n t int int 类型的整数 e x p o n e n t exponent exponent。求 b a s e base base 的 e x p o n e n t exponent exponent 次方。
思路:这道题考察了指数,列出所有情况;
- 其中, e x p o n e n t exponent exponent 有正有负,分开考虑;
- b a s e = 0 , e x p o n e n t > 0 base=0,exponent>0 base=0,exponent>0,那么 r e s u l t result result =0;
- b a s e ! = 0 , e x p o n e n t > 0 base!=0,exponent>0 base!=0,exponent>0,那么 r e s u l t result result =乘方;
- b a s e ! = 0 , e x p o n e n t < 0 base!=0,exponent<0 base!=0,exponent<0,那么 r e s u l t result result =乘方的倒数,即:1/乘方;
- b a s e = 0 , e x p o n e n t = 0 base=0,exponent=0 base=0,exponent=0,那么 r e s u l t result result =1;
- 其中,又分奇数和偶数;
测试代码:
class Solution {
public:
double Power(double base, int exponent) {
int p = abs(exponent);
double r = 1.0;
while (p){
if( p & 1 ) //奇数
r = r*base;
base = base*base;
p = p >> 1; //p>>=1;偶数
}
return (exponent > 0) ? r : 1 / r;
}
};