这个题的坑真的是太多了,感觉踩了好多的坑,
首先,暴力枚举是不可能的,肯定会超时,然后又尝试了下二分法查,结果发现溢出,因为一开始选择的方法是a*a=x,这样确实会溢出,后来有尝试了下除法,结果还是过不去,仔细一想,应该是mid作为除数不能有为零的情况,所以把mid,max,min初始值最好都不要设为0,都设为从1开始,这样x为0的情况也统计进去了。
代码如下:
public class SqrtX {
public static void main(String[] args) {
SqrtX sqrtX=new SqrtX();
System.out.println(sqrtX.mySqrt(0));
}
public int mySqrt(int x) {
int max,mid,min;
//min不能为0,否则出发报runtime erro
min=1;
mid=1;
max=x/2+1;
if(x==0)
{
return 0;
}
//不能用简单二分法,否则会超时,枚举更不用说了
while(min<=max)
{
mid = min + ((max-min) >> 1);
//不能用乘法,不然会溢出的
if(x/mid<mid)
{
max=mid-1;
}
else if(x/mid>mid)
{
min=mid+1;
}
else
{return mid;}
}
return max;
}
}