A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

题目
实现 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] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路
思路1-对数运算与幂运算的对立逻辑
思路解析:对n进行以2为底的对数运算,对x进行以x为底的幂运算,递归进行,注意最后要进行符号处理:
一个例子:求2.0的10次方

10/2得5余数0,对应(2∗2)∗(2∗2)∗(2∗2)∗(2∗2)∗(2∗2)=4∗4∗4∗4∗4
5/2得2余数1,对应(4∗4)∗(4∗4)∗4=16∗16∗4,这里4需要额外保存最后再乘进去;
2/2得1余数0,对应16∗16=256,上一步的4取走一个,每次只计算成对的因子;
1/2得0余数1,此时只剩256,需要保留256与之前保留的乘起来,即这一步为256∗4=1024,计算完毕;
tips:

这个例子中间只保留了一次不成对的情况值,对于其他的例子,可能中间要保留好几次,但最终都是将这些值连乘起来才得到最终结果;
对n的对数压缩映射到对x的幂积放大上,效率很快
因为计算n的时候是忽略了正负号的,所以若n为负数,最终值需要取倒数;
算法复杂度:

时间复杂度: O(logn)
空间复杂度: O(1)
算法源码示例
package leetcode;

/**
* @author ZhouJie
* @date 2020年2月2日 下午10:23:55
* @Description: 50. Pow(x, n)
*
*/
public class LeetCode_0050 {

}

class Solution_0050 {
        /**
         * @author: ZhouJie
         * @date: 2020年2月4日 下午11:29:49
         * @param: @param x
         * @param: @param n
         * @param: @return
         * @return: double
         * @Description: 1-对n进行对数运算,对x进行幂计算;
         *
         */
        public double myPow(double x, int n) {
                boolean f = n > 0;
                double y = 1.0;
                while (n != 0) {
                        // 对n取对数的同时对x进行幂计算,若n不为2的倍数则补乘一次x;
                        if (n % 2 != 0) {
                                y *= x;
                        }
                        x *= x;
                        n /= 2;
                }
                return f ? y : 1 / y;
        }
}

Talk is cheap. Show me the code.
更多讯息欢迎添加小优:DKA-2018

1 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马