10幂次

181 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」。

前言

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

示例 1:

输入: 2.00000, 10 输出: 1024.00000 示例 2:

输入: 2.10000, 3 输出: 9.26100 示例 3:

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

-100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

解题思路

这道题是让我们实现数学函数幂,因此直接调用系统内置函数是不被允许的。

符合直觉的做法是将x乘以n次,这种做法的时间复杂度是O(N)O(N)。

经实际测试,这种做法果然超时了。测试用例通过 291/304,在 0.00001\n2147483647这个测试用例挂掉了。如果是面试,这个解法可以作为一种兜底解法。

解题思路2

首先我们要知道:

如果想要求 x ^ 4,那么我们可以求 (x^2)^2 如果是奇数,会有一点不同。 比如 x ^ 5 就等价于 x * (x^2)^2。 当然 x ^ 5 可以等价于 (x ^ 2) ^ 2.5, 但是这不相当于直接调用了幂函数了么。对于整数,我们可以很方便的模拟,但是小数就不方便了。

我们的思路就是:

将 n 地板除 2,我们不妨设结果为 a 那么 myPow(x, n) 就等价于 myPow(x, a) * myPow(x, n - a) 很可惜这种算法也会超时,原因在于重复计算会比较多,你可以试一下缓存一下计算看能不能通过。

如果你搞不清楚有哪些重复计算,建议画图理解一下。

private double departPow(double x, int n) {
    if (n == 1) {
        return x;
    }
    if (n == 0) {
        return 1;
    }    
    int half = n / 2;
    double halfResult = departPow(x, half);
    if (n % 2 == 0) {
        return halfResult * halfResult;
    } else {
        return halfResult * halfResult * x;
    }         
}

总结

  • 实际上就是不断的乘法,在代码层面表现就是递归 是最简单粗暴的。为了运行快速,我们针对特殊的情况进行特殊的处理,所以有上面两个针对0,1的处理