这是一道简单题,介绍两种思路,第一种比较暴力,第二种利用二分查找。
题目描述:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
第一种方法:
思路:一共有两种情况:
(1)X的平方根恰好是正整数;
(2)X的平方根不是正整数;
对于第一种情况,不用多说,因为X是int类型的正整数,所以从a = 0开始求a的平方数,终会求得X,这时返回a即可;
第二种情况,因为返回的时候小数部分被舍去,所以当从a = 0开始遍历的时候,终会经历a = k时平方数小于X,a = k + 1时平方数大于X,那这时只要返回k即可;
综上,给出Java代码:
class Solution {
public static int mySqrt(int x) {
long a = 0;
long sqrt = 0;
for(;a < Integer.MAX_VALUE;a++) {
sqrt = a * a;
if(sqrt > x) break;
}
return (int)a - 1;
}
}
其中还要注意的是,因为在整型边界的时候,会出现越界的情况,所以要将a,sqrt都设成long型,最后再强转回int。
第二种方法:
思路:利用二分查找
因为int型的最大值是231 - 1,所以将end设置为216 就足够了;整体思路还是很简单的,看代码就应该能明白。
Java代码:
class Solution {
public static int mySqrt(int x) {
if(x == 0) return 0;
long start = 0;
long end = (long)Math.pow(2,16);
long mid = start + (end - start)/2;
long sqrt = mid * mid;
while (start <= end) {
mid = start + (end - start)/2;
sqrt = mid * mid;
if(sqrt == x) return (int)mid;
else if(sqrt > x) {
end = mid - 1;
}
else start = mid + 1;
}
return (int)end;
}
}
至于为什么返回end,是因为如果平方根不是正整数,那么我们要向下取整,而while循环结束后start > end,所以应该返回end。