第一题求一个int数的平方根,返回值也是int,开始直接用循环做,结果不出意料的超时了,还是要用二分法。
每一次都排除掉一半的值,时间复杂度就低了很多~
代码的实现还是很简单易懂的:
public int sqrt(int x) {
int low = 0;
int high = x;
double diff = 0.01;
while(low <= high){
double mid = (high+low)/2;
if((x-mid*mid)>diff){
low = (int)mid+1;
}else if((x-mid*mid)<-diff){
high = (int)mid-1;
}else if((x-mid*mid)>=-diff && (x-mid*mid)<=diff){
return (int)mid;
}
}
return high;
}
第二题求幂,做法更简单,不过得考虑奇偶数和正负数幂,其他没什么特别的。
public double pow(double x, int n) {
if(n>0)
return power(x,n);
else
return 1/power(x,-n);
}
public double power(double x, int n){
if(n == 0)return 1;
double v = power(x,n/2);
if(n%2 == 0)
return v*v;
else
return v*v*x;
}