文内代码全部采用JAVA语言。
题目
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
测试用例
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
个人解法
数学上的手动求解平方根用的是二分法。二分法比较简单,直接上代码。范围从左右两边往中间收缩。左边起始i=0,右边起始位j=x,每次检查中间值(i+j)/2的平方,和x进行比较。1实在是放不进去,就单独处理了。
执行用时: 25 ms, 在Sqrt(x)的Java提交中击败了86.16% 的用户。尚可。
注意为了防止从溢出,中间值的平方应该设为long形,反正用int百分百要溢出。
class Solution {
public int mySqrt(int x) {
int i=0;
int j=x;
if (x==1) {
return 1;
}
while (i+1<j) {
long temp=(i+j)/2;
if (x<(temp*temp)) {
j=(int)temp;
}else if (x>=temp*temp) {
i=(int)temp;
}
}
return i;
}
}
也有简单粗暴的求法,就是从0开始遍历,满足目标x就输出,不过速度就慢多了。大概要81 ms。
class Solution {
public int mySqrt(int x) {
int ans = 0;
for (long i = 0; i <= x; i++) {
if (i*i<=x && (i+1)*(i+1)>x) {
ans=(int)i;
break;
}
}
return ans;
}
}
评论区解法
评论区很多就直接调用math.sqrt();虽然很快但是不符合题目的要求。
二分法应该是最优解法了,至于如何把代码写的又简洁,运行速度又快,就需要进一步学习了。