/**
* 面试题16:数值的整数次方
* 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
* 保证base和exponent不同时为0
* @author
* @create 2021-03-17 14:51
*/
public class Solution16 {
public static void main(String[] args) {
double res = power(2, 11);
System.out.println(res);
}
public static double power(double base, int exponent){
if (base == 0.0){
return 0.0;
}
if (exponent < 0){
//为负数时将exponent取绝对值
exponent = -exponent;
base = 1 / base;
}
//return powerWithExponent(base,exponent);
// return powerWithExponentRecursion(base,exponent);
return powerWithExponentNonRecursion(base,exponent);
}
/**
* 常规求解,时间复杂度为O(n)
* @param base
* @param exponent
* @return
*/
public static double powerWithExponent(double base, int exponent){
//考虑边界
if (exponent == 0){
return 1.0;
}
if (exponent == 1){
return base;
}
double result = 1.0;
for (int i = 0; i< exponent; i++){
result *= base;
}
return result;
}
/**
* 递归法(快速幂)
* 时间复杂度:O(logn),因为n的二进制位个数为logn
* 空间复杂度:O(1)
* @param base
* @param exponent
* @return
*/
public static double powerWithExponentRecursion(double base, int exponent){
//考虑边界
if (exponent == 0){
return 1.0;
}
if (exponent == 1){
return base;
}
double result = powerWithExponentRecursion(base, exponent >> 1);
result *= result;//exponent为偶数时,result为base的平方,4次方,8次方,16次方
if ((exponent & 1) == 1){
result *= base;//exponent为奇数时,result为base的三次方,5次方,7次方,9次方
}
return result;
}
public static double powerWithExponentNonRecursion(double base, int exponent){
double x = base;
double ret = 1.0;
while (exponent!=0){
if ((exponent & 1) != 0){
ret *= x;
}
x *= x; //x的2次方、4次方、8次方。。。
exponent >>= 1;
}
return ret;
}
}
【剑指Offer】面试题16:数值的整数次方
最新推荐文章于 2022-05-03 15:40:21 发布