Brute force的方法就是从头乘到位,这个题一下就是想到binary search。不停的分成两部分,这个时候就要考虑这个n是偶数还是奇数。程序实现比较容易。
public double pow(double x, int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(n==0) return 1.0;
if(n==1) return x;
if(n==-1) return 1/x;
if(n%2==0){
double temp = pow(x,n/2);
return temp*temp;
}else{
double temp = pow(x,(n-1)/2);
return temp*temp*x;
}
}
这个题除了二分不知道难点在哪里,后来发现有一个corner case没有考虑到,就是负数转换为正数的时候会溢出。另外用位操作。
public double myPow(double x, int n) {
if (n==0) return 1;
boolean isOverflow = false;
if (n<0) {
x = 1/x;
if (n==Integer.MIN_VALUE) {
n = Integer.MAX_VALUE;
isOverflow = true;
} else {
n=-n;
}
}
double t = 1;
if (isOverflow) t = t*x;
while (n>0) {
int last = n&1;
if (last == 1) {
t = t*x;
}
x= x*x;
n=n>>1;
}
return t;
}
No comments:
Post a Comment