Java算法編程題是程序員常見的挑戰(zhàn)之一。隨著軟件開發(fā)行業(yè)的變化,越來越多的公司將算法知識作為面試的重要考察點。下面我們來看一道經(jīng)典的Java算法編程題:
/** * 實現(xiàn) pow(x, n) ,即計算 x 的 n 次冪函數(shù)(即,xn)。 * 示例 1: * 輸入: 2.00000, 10 * 輸出: 1024.00000 * 示例 2: * 輸入: 2.10000, 3 * 輸出: 9.26100 * 示例 3: * 輸入: 2.00000, -2 * 輸出: 0.25000 * 解釋: 2-2 = 1/22 = 1/4 = 0.25 * 提示: * -100.0< x< 100.0 * -231<= n<= 231-1 * -104<= xn<= 104 */ public class Solution { public double myPow(double x, int n) { if(n<0){ x=1/x; n=-(n+1);//對n+1進(jìn)行處理,避免在n=Integer.MIN_VALUE時溢出 } double ans=1; double current=x; for(int i=n;i>0;i/=2){ if(i%2==1){ ans*=current; } current*=current; } return ans; } }
這道題的思路是使用二分法不斷縮小規(guī)模,直到規(guī)模被縮小到0為止。
首先,如果n為負(fù)數(shù),將x轉(zhuǎn)化為1/x,將n轉(zhuǎn)化為-n+1。這是因為當(dāng)n=Integer.MIN_VALUE時,直接取相反數(shù)會導(dǎo)致溢出,所以需要進(jìn)行處理。
接著,使用循環(huán)來逐步縮小n的規(guī)模。每次循環(huán)將n除以2,如果n為奇數(shù),則將當(dāng)前的答案乘以current(此時current為x的冪),并更新current的值。
最后,當(dāng)n為0時,返回答案。