题目:给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
class Solution {
public int mySqrt(int x) {
int start = 0 ;
int end = x;
int res = 0;
while(start <= end){
/**
一般情况下,按位运算的速度比除法的速度快
按位运算只用找被除数
除法运算不仅要找被除数还要找除数
*/
//这里不能按位运算,会出现超出时间范围错误
// int mid = start + (end - start)>>1;
int mid = start + (end - start)/2;
long l = (long)mid * mid ;
if(l <= x){
start = mid + 1;
/*
必须是在mid<=x的平方根的时候将mid的值给res
若是在if条件语句外进行赋值,因为start<=end,
当找到答案后,还需要进行一次循环,
mid的值会改
*/
res = mid;
}else{
end = mid - 1;
}
}
return res;
}
}
有两点需要注意的地方:
- 按位右移运算所费时间超过除法运算,一般情况是按位快于除法,如果代码没有问题却出现超出时间范围考虑是否是因为按位预算
- (long)(int*int)不能将int类型的转换为long,int溢出后变成负数。