跳到主要内容

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

题目描述

做题链接: 面试题16. 数值的整数次方

实现数值的整数次方。不得使用库函数,同时不需要考虑大数问题。

解题思路

方法一: 快速幂

二分推导:

  • 当 n 为偶数: $x^n=x^{n/2}\times x^{n/2}$
  • 当 n 为奇数: $x^n=x^{n/2}\times x^{n/2}\times x$

时间复杂度为 $O(log_2n)$ 空间复杂度 $O(1)$

方法二:数学递推法 + 位运算

举例 $n = 9$ ,用二进制可表示为 $n = 9 = 1001_b$ $$ x^9 = 1\times x^{2^0} \times x^{2^3} $$ 这里,发现 $x^{2^0} = y$, 此时公式就变成 $$ x^9 = 1\times y \times y^3 $$ 可以发现,只要对应二进制位为 0 的话,就不乘上去。

代码

方法一:快速幂

class Solution:
def myPow(self, x: float, n: int) -> float:
if n == 0: return 1
if n == 1: return x
pos_n = abs(n)
temp = self.myPow(x, pos_n >> 1)
res = temp * temp * (x if pos_n & 1 else 1)
return res if n > 0 else 1/res

方法二:数据递推法 + 位运算

class Solution:
def myPow(self, x: float, n: int) -> float:
pos_n = abs(n)
res = 1
while pos_n:
res = res * (x if (pos_n & 1) else 1)
pos_n = pos_n >> 1
x = x * x
return res if n > 0 else 1/res