【leetcode】50.(Medium )Pow(x,n)
阿新 • • 發佈:2018-11-10
解題思路:
這道題的意思就是求x的n次方。
如果xx求下去,求n-1次,這樣是超時的。
我的思路是,首先求xx,然後n就可以減少2,然後求(xx)(x*x),這樣n就可以減少4…
就是n不是-1、-1、-1…這樣減下去,而是-2、-4、-8…這樣減下去
迭代cnt次後,可以讓n減少2^(cnt)-1(次)(等比求和),cnt是這麼求的:
int cnt=(int)Math.floor(Math.log(n)/Math.log(2));
然後看n還剩下多少,對n進行遞迴
用一個一位的陣列res(result)來記錄結果的原因是,我想通過calculatePow來改變兩個變數的值,res和n。如果將res設為一個單純的double變數,無法通過子函式改變res的值,只能建立一個數組,然後將res的值的存到數組裡,再將陣列傳遞進入子函式,才能改變這個值。
提交程式碼:
class Solution {
public double myPow(double x, int n) {
if(n==0) return (double)1;
if(x==1) return (double)1;
if(x==-1){
if(n%2==0) return (double)1;
else return (double)(-1);
}
if(n==Integer.MIN_VALUE) return 0;
double res[]=new double[1];
res[0]=1;
boolean flag1=n>0?true:false; //判斷是否取倒數
int flag2=(x<0)&&(n%2!=0)?-1:1;
n=Math.abs(n);
x=Math.abs(x);
while(n>1)
n=calculatePow(x,n,res);
res[0]*=x;
if(flag1) return (double )(flag2*res[0]);
else return (double)(flag2*1/res[0]);
}
public int calculatePow(double x,int n,double[] res) {
int fold=1;
double base=x;
int cnt=(int)Math.floor(Math.log(n)/Math.log(2));
for(int i=0;i<cnt;i++) {
res[0]*=base;
base*=base;
n-=fold;
fold*=2;
}
return n;
}
}
執行結果: