题目
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
案例
- 2.5的3次方,3.6的5次方,2.8的-3次方等等
分析
- 第一想法就是return Math.pow(base, exponent);然后通过了,这也是一个方法,java内部封装好的工具类
- 但是题目显然不是为了让我们那么随便过去的,而是要达到锻炼的目的
- 一种就是直接循环,先将exponent取绝对值,然后一次次让base相乘,最后判断exponent的正负来决定是否取相反数
- 另一种就是递归调用,利用二进制来计算
解题代码:循环相乘
// 传统公式求解时间复杂度O(n)
public class Solution {
public double Power(double base, int exponent) {
double result = 1;
for(int i = 0; i < Math.abs(exponent); i++)
{
result *= base;
}
if(exponent < 0)
{
result = 1 / result;
}
return result;
}
}
- 解题代码:递归调用
// 递归:n为偶数,a^n=a^n/2*a^n/2;n为奇数,a^n=(a^(n-1)/2)*(a^(n-1/2))*a
// 时间复杂度O(logn)
public class Solution {
public double Power(double base, int exponent) {
// 取绝对值
int n = Math.abs(exponent);
// 特殊情况直接返回
if(n == 0) return 1;
if(n == 1) return base;
// 递归调用,>>1的话,偶数相当于直接除以2,奇数相当于减一之后除以2
double result = Power(base, n >> 1);
result *= result;
// 如果是&1等于1的话,代表是奇数,则需要再乘一次
if((n & 1) == 1)
result *= base;
// 如果小于0,则需要取相反数
if(exponent < 0)
result = 1 / result;
return result;
}
}
- 总结
- 题目比较简单,前面两种都容易理解,递归需要仔细思考一下,还是利用到了二进制的性质来解答