剑指offer——数值的整数次方

题目描述:给定一个double类型的浮点数base和int类型的整数exponet。求base的exponet次方。保证base和exponet不同时位0。

示例1:

输入:2.00000,3

返回值:8.00000

示例2:

输入:2.10000,3

返回值:9.26100

思路及解答:

如果使用暴力解法,就是不断相乘,对于负数而言,则是相除,并且符号取反。

Java代码实现如下所示:

public class Solution{
    public double Power(double b, int n){
        if(n < 0){
            b = 1 / b;
            n = -n;
        }
        double result = 1.0;
        for(int i = 0 ; i < n ; ++i){
            result *= b;
        }
        return result;
    } 
}

题目中的double类型应该不能拆解,但是int类型的整数exponet我们可以考虑换个思路,我们平时求解次方的时候,假设有个X的4次方,我们通常是求出一个X的平方数,然后两个X平方相乘得出X的四次方。这里使用递归的方法,同时考虑边界条件如果指数是负数,则先取反,然后取结果的倒数即可。

$$ Power(base,ex)=\begin{cases} base*Power(base,ex-1),ex取余2=1 \ Power(base,ex/2)*Power(base,ex/2),ex取余2=0\ \end{cases} $$

Java代码实现如下所示:

public double Power(double base, int exponent) {
    if (exponent == 0) {
    // 指数为0则直接返回1
        return 1;
    }
    if (base == 0) {
     //底数为0直接返回0
        return 0;
     }
    // 判断指数是否为负数
    boolean isNegative = false;
    if (exponent < 1) {
        exponent = -exponent;
        isNegative = true;
    }
    double result;
    if (exponent % 2 == 1) {
        result = base * Power(base, exponent - 1);
    }else {
        double temp = Power(base, exponent / 2);
        result = temp * temp;
    }
        return isNegative ? (1.0 / result) : result;
}

时间复杂度:O(logn),每次计算后规模缩小一半 空间复杂度:O(logn),递归的时候,栈需要用到变量

你可能感兴趣的:(剑指offer刷题,算法,数据结构,java,开发语言,leetcode,职场和发展,intellij-idea)