剑指 Offer 16. 数值的整数次方 | 算法

47 阅读1分钟

剑指 Offer 16. 数值的整数次方

实现 pow(xn) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

  示例 1:

输入: x = 2.00000, n = 10
输出: 1024.00000

示例 2:

输入: x = 2.10000, n = 3
输出: 9.26100

示例 3:

输入: x = 2.00000, n = -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

 

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • -104 <= xn <= 104

思路1: 快速幂 www.cnblogs.com/wuguanglin/…

image.png

image.png image.png

javascript:

var myPow = function(x, n) {
    let res = 1.0
    let abn = n < 0 ? -n : n;
    while (abn > 0) {
        if (abn & 1) {
            res *= x;
        }
        x *= x;
        //进行无符号右移1位,此处不能使用有符号右移(>>)
        abn >>>= 1;
    }

    return n > 0 ? res : 1/res;
};

思路2: 递归

使用递归的方法: n=0时,任何x都返回1 n=1时,返回x n=-1时,返回1/x

对于其他n值: 当n为偶数时,myPow(x,n) = myPow(x,n/2)* myPow(x,n/2) 当n为奇数时:myPow(x,n) = myPow(x,(n-1)/2) * myPow(x,(n-1)/2) * x 注意:递归时先用一个变量取得myPow(x,n/2)的值再平方,可以降低时间复杂度(减少递归调用的次数)

typescript:

function myPow(x: number, n: number): number {
    if (n === 0) return 1;
    if (n === 1) return x;
    if (n === -1) return 1 / x;

    if (n % 2 === 0) {
        let a = myPow(x, n / 2);
        return a * a;
    } else {
        let b = myPow(x, (n - 1) / 2);
        return b*b*x;
    }
};