给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
这道题的难点不是思路,反而是要考虑清楚各种情况,情况分为两种:
- 底数 base 为 0
- 则 指数 为0没有意义,当然题目已经排除了这种情况
- 指数 > 0,则返回 0
- 指数 < 0,这种情况是用 0 做分母,出错,我的做法是抛出异常
- 底数 base 不为 0
- 如果指数为 0 ,则返回 1
- 如果指数 > 0 ,则做乘法
- 如果指数 < 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;
}
}
测试用例:把底数和指数分别设置为正数、负数和零