版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/86365083
Implement int sqrt(int x)
.
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
方法:
/**
* 使用二分法比较
* Runtime: 29 ms, faster than 79.84%
*
* @param x
* @return
*/
public int mySqrt(int x) {
if (x == 0) {
return 0;
}
if (x >= 1 && x <= 3) {
return 1;
}
if (x >= 4 && x <= 8) {
return 2;
}
//切记不能用int,当x=2147395599时,第一次mid=536848900,但是mid*mid=484528144,并不是正确值!
//使用long则不会发生int类型的问题
long left = 2, right = x / 2;
while (left <= right) {
long mid = (left + right) / 2;
if (mid * mid == x) {
return (int) mid;
} else if ((mid * mid) > x) {//比较完mid后,同时再比较mid - 1
if ((mid - 1) * (mid - 1) <= x) {
return (int) mid - 1;
}
right = mid - 1;
} else {
if ((mid + 1) * (mid + 1) > x) {//比较完mid后,同时再比较mid + 1
return (int) mid;
} else if ((mid + 1) * (mid + 1) == x) {
return (int) mid + 1;
}
left = mid + 1;
}
}
return -1;
}
/**
* Runtime: 28 ms, faster than 91.10%
*
* @param x
* @return
*/
public int mySqrt4(int x) {
return (int) Math.sqrt(x);
}
/**
* Time Limit Exceeded
*
* @param x
* @return
*/
public int mySqrt3(int x) {
for (int i = 0; i <= x; i++) {
if (i * i == x) {
return i;
}
if (i * i > x) {
return i - 1;
}
}
return 0;
}
/**
* Wrong Answer
*
* @param x
* @return
*/
public int mySqrt2(int x) {
if (x == 0) {
return 0;
}
if (x >= 1 && x <= 3) {
return 1;
}
if (x >= 4 && x <= 8) {
return 2;
}
int half = x / 2;
for (int i = 1; i <= half + 1; i++) {
if (i * i == x) {
return i;
}
if (i * i > x) {
return i - 1;
}
}
return 0;
}//mySqrt
// System.out.println(leetcode_69_sqrtx.mySqrt(10));//3
// System.out.println(leetcode_69_sqrtx.mySqrt(101));//10
// System.out.println(leetcode_69_sqrtx.mySqrt(10001));//100
System.out.println(leetcode_69_sqrtx.mySqrt(2147395599));//46339
关于int溢出,可见 java int溢出,结果只会保留低32位,高位会抛弃掉
end