20200228
题目 :二进制中1的个数
实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
思路 :与二进制有关的题目,通常应用位运算解决。
- 根据 与运算 定义,设二进制数字 n,则有:
- 若n& 1 = 0n&1=0 ,则 n二进制 最右一位 为 0 ;
- 若 n & 1 = 1n&1=1 ,则 n 二进制 最右一位 为 1 。
- 循环判断:
- 判断n最右一位是否为1,根据结果计数。
- 将n右移位。
code
public class Solution{
public int hammingWeight(int n){
int res = 0;
while(n != 0){
res += n & 1;
n >>>= 1;//向右移动一位。
}
return res;
}
}
复杂度分析
- 时间复杂度$ O(log_2n) O(1) log_2n log_2n n$最高位1的所在位数。
- 空间复杂度$ O(1) res$使用常数大小额外空间。
题目 :数值的整数次方
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
思路 :快速幂解析(二进制角度):
- 对于任何二进制正整数,设其二进制为“$ b_m…b_3b_2b_1 b_i i\in[1,m]$),则有:
- 二进制转十进制:$ n=1b_1 + 2b_2 + 4b_3 +…+ 2^{m-1}b_m$
- 幂的二进制展开:$ x^n = x^{1b_1 + 2b_2 + 4b_3 +…+ 2^{m-1}b_m} = x{1b_1}x{2b_2}x{4b_3}…x{m-1b_m}$;
- 根据以上推到,可把计算$ x^n$转化为解决以下两个问题:
- 计算$ x1,x2,x4,…,x{2{m-1}}$的值:循环执行$x=x2$以下操作即可;
- 获取二进制各位$ b_1,b_2,b_3,…,b_m$的值:循环执行以下操作即可。
- $ n&1 n$二进制最右一位是否是1;
- $ n >>= 1 n$右移一位。
code
class Solution{
public double myPow(double x, int n){
long b = n;
double res = 1.0;
if(b < 0){
x = 1 / x;
b = -b;
}
while(b > 0){
if((b & 1) == 1) res *= x;
x *= x;
b >>= 1;
}
return res;
}
}
复杂度分析:
- 时间复杂度 $ O(log_2 n)$: 二分的时间复杂度为对数级别。
- 空间复杂度 $ O(1)$: resres, bb 等变量占用常数大小额外空间
来源:CSDN
作者:jjxwj
链接:https://blog.csdn.net/qq_31900497/article/details/104552229