劍指12.數值的整數次方
阿新 • • 發佈:2020-08-08
題目描述
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。 保證base和exponent不同時為0分析
看似簡單,需要注意的小細節比較多!!首先要充分考慮好邊界條件,還要考慮到如果指數exponent為負數的情況。
解法1(傳統解法,時間複雜度為O(n))
public class Solution { public double Power(double base, int exponent) { if (base ==0.0 && exponent <= 0)throw new RuntimeException(); if (exponent == 0) return 1; if (base == 0) return 0; int absExponent = exponent > 0 ? exponent : -exponent; double result = 1.0; for(int i = 0; i < absExponent; i++) result *= base; returnexponent > 0 ? result : 1.0/result; } }
解法2(快速冪演算法,時間複雜度為O(logn))
快速冪求a的n次方:
另外,應儘可能用位運算代替乘除法以及求餘運算,因為位運算的效率要高得多!!比如,可以用右移代替除以2,用位運算子代替求餘運算子%來判斷一個數是的奇偶性。
☆解法2.1 快速冪的遞迴實現
public class Solution { public double Power(double base, int exponent) { if (base ==0.0 && exponent <= 0)throw new RuntimeException(); if (exponent == 0) return 1; if (base == 0) return 0; int absExponent = exponent > 0 ? exponent : -exponent; double result = PowWithUnsignedExponent(base, absExponent); return exponent > 0 ? result : 1.0/result; } //快速冪演算法的遞迴實現 public double PowWithUnsignedExponent(double base,int absExponent){ if (absExponent == 0) return 1; if (absExponent == 1) return base; double result = PowWithUnsignedExponent(base,absExponent>>1);// 口訣:左移乘2,右移除2 result *= result; //位運算判斷奇偶性,如果為0即為偶數,反之為1即為奇數 if ((absExponent & 1)==1) result *= base; return result; } }
解法2.2 快速冪非遞迴實現,遞推
public class Solution { public double Power(double base, int exponent) { if (base ==0.0 && exponent <= 0) throw new RuntimeException(); if (exponent == 0) return 1; if (base == 0) return 0; int absExponent = exponent > 0 ? exponent : -exponent; double result = 1.0; while(absExponent > 0){ if((absExponent & 1) == 1) result *= base; absExponent = absExponent >> 1; base *= base; } return exponent > 0 ? result : 1.0/result; } }