《剑指offer》-数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0

这道题的难点不是思路,反而是要考虑清楚各种情况,情况分为两种:

  1. 底数 base 为 0
    1. 则 指数 为0没有意义,当然题目已经排除了这种情况
    2. 指数 > 0,则返回 0
    3. 指数 < 0,这种情况是用 0 做分母,出错,我的做法是抛出异常
  2. 底数 base 不为 0
    1. 如果指数为 0 ,则返回 1
    2. 如果指数 > 0 ,则做乘法
    3. 如果指数 < 0 ,则按照绝对值做乘法,然后返回其结果的倒数

难点是:如果指数是负数,那么就要算完结果之后,返回其倒数。如果不仅仅指数是负数,同时底数还是 0 ,这种情况就属于异常情况,需要多加注意。
考虑一个代码的完整性的时候,可以从三个方面考虑:功能测试、边界测试、负面测试

这里写了两种方法
第一种方法是按照思路写的,考虑了各种情况,但是在做乘法的时候,没有进行优化
第二种方法在做乘法运算的时候,做了优化,时间复杂度从 O(N) 降到了 O(LOG N)
具体如下:指数分奇数偶数,可以减少运算量
同时还是用了位运算符代替除法、用位运算符判断奇数偶数、用三目运算符、抛出异常

public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0){
            if(exponent >= 1){
                return 0;
            }
            if(exponent <= -1){
                throw new RuntimeException();
            }
        }
        double result = 1.0;
        int absExponent = Math.abs(exponent);
        for(int i = 1;i <= absExponent;i++){
            result = result * base;
        }
        if(exponent <= -1){
            return 1/result;
        }
        return result;
  }
}
public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0 && exponent <= -1){
            throw new RuntimeException();
        }
        if(base == 0){
            return 0;
        }
        double result = MyPowerWithAbsExponent(base, Math.abs(exponent));
        return exponent>0?result:1/result;
    }
    
    public double MyPowerWithAbsExponent(double base, int exponent){
        if(exponent == 0){
            return 1;
        }
        if(exponent == 1){
            return base;
        }
        double result = MyPowerWithAbsExponent(base, exponent >> 1);
        result *= result;
        if((exponent & 1) == 1){
            result *= base;
        }
        return result;
    }
}

测试用例:把底数和指数分别设置为正数、负数和零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值