剑指offer-20200228

耗尽温柔 提交于 2020-02-28 12:43:23

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 等变量占用常数大小额外空间
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!