【JS每日一算法】44.Pow(x, n)(暴力破解,快速幂)

283 阅读1分钟

实现pow(x, n),即计算x的整数n次幂函数(即,x^n )。

示例 1:

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

示例 2:

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

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 暴力破解   TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} x  给定幂运算指数
 * @param {*} n  给定幂运算底数
 * @return {*}
 */
function bruteForce(x, n) {
    /**
     * 该方案使用暴力破解的方式,当指数n为负数时,我们可以计算x^(-n)
     * 再取倒数得到结果,因此我们只需要考虑 n 为自然数的情况即可。暴
     * 力破解即为模拟幂运算过程,遍历指数次数,结果不断乘上x即达到了
     * x*x*x........n个x相乘的结果
     */
    let exponent = n > 0 ? n : -n,
        result = 1;
    while (exponent-- > 0) {
        result *= x;
    }
    return n > 0 ? result : 1 / result;
}


/**
 * @description: 快速幂   TC:O(logn)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} x  给定幂运算指数
 * @param {*} n  给定幂运算底数
 * @return {*}
 */
function fastPower(x, n) {
    /**
     * 本方案采用快速幂,上述暴力破解算法是一个x逼近x^n,我们可以
     * 考虑采用成倍递增的方式逼近x^n,即x -> x^2 -> x^4 -> x^8
     */

    // 指数为负数转为正数处理
    let exponent = n > 0 ? n : -n,
        //  初始化结果为1
        result = 1;
    // 当指数小于等于0,证明
    while (exponent > 0) {
        // 如果指数二进制表示的最低位为1,那么需要计入结果统计
        if (exponent % 2 === 1) result *= x
        // 成倍递增逼近
        x *= x
        // 舍弃指数二进制表示的最低位,这样我们每次只要判断最低位即可
        exponent = Math.floor(exponent / 2)
    }
    // 返回结果
    return n > 0 ? result : 1 / result;
}

来源:力扣(LeetCode)