Leetcode 69. Sqrt(x) -- 求整數的算術平方根,返回整數,把小數位截斷
阿新 • • 發佈:2019-01-14
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