剑指offer第二版(Python3)--面试题16:数值的整数次方

第2章 面试需要的基础知识

第3章 高质量的代码

  面试题16:数值的整数次方

  面试题21:调整数组顺序使奇数位于偶数前面

第4章 解决面试题的思路

第5章 优化时间和空间效率

第6章 面试中的各项能力

第7章 两个面试案例


题目描述
  给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。

  这道题按照书上的解题方法,Python3代码过不了


解题思路
博客

  传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:213 = 222*……*2,连乘十三次。
  利用指数的二进制,可以实现复杂度为o(logn)的幂运算。还是以2^13为例,2的13次方可以分解成以下形式:
          213 = 21 x 24x 28
  而13的二进制为1101,对比上式的指数,二进制第一位为1,即0x0001=1,乘以21;二进制第三位为1,即0x0100=4,乘以24,二进制第四位为1,即0x1000=8,乘以28
  我们根据二进制数的位数来确定一个数列,数列中每一位数都是前面数的平方,例如四位数的二进制数可以产生[31, 32, 34, 38]的一组数列,不管二进制数中是1还是0。得到这样的一组数后,幂运算就很好计算了,比如1001,只要将对应位为1的数相乘即可,39=31x38

实战

class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if exponent == 1:
            return base
        
        result = 1
        negative = False
        if exponent < 0:
            exponent = -exponent
            negative = True
        while exponent:
            if exponent & 0x1:
                result *= base
            base *= base
            exponent = exponent >> 1
        if negative:
            return 1 / result
        return result

你可能感兴趣的:(算法设计,剑指offer,数值的整数次方)