【题目描述】

给你一个非负整数 ​​x​​​ ,计算并返回 ​​x​​ 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 ​​pow(x, 0.5)​​​ 或者 ​​x ** 0.5​​ 。

 ​​https://leetcode.cn/problems/sqrtx/​


【示例】

【LeeCode】69. x 的平方根 _java

【代码】admin

package com.company;
// 2023-03-06
import java.util.*;

class Solution {
public int mySqrt(int x) {
double sqrt = Math.sqrt(x);
int res = (int)Math.floor(sqrt);
return res;
}
}

public class Test {
public static void main(String[] args) {
new Solution().mySqrt(4); // 输出: 2
new Solution().mySqrt(8); // 输出: 2
}
}

【代码】admin

package com.company;
// 2023-03-06
import java.util.*;

class Solution {
public int mySqrt(int x) {
long res = -1;
// 防止数值相乘后越界
for (int i = 0; (long) i * i <= x; i++){
res = i;
}
System.out.println(res);
return (int)res;
}
}

public class Test {
public static void main(String[] args) {
new Solution().mySqrt(2147395600); // 输出: 46340
new Solution().mySqrt(2); // 输出: 2
new Solution().mySqrt(8); // 输出: 2
}
}

【代码】​​二分法​

【LeeCode】69. x 的平方根 _java_02

package com.company;
// 2023-03-06
import java.util.*;

class Solution {
public int mySqrt(int x) {
int res = -1;
int left = 0;
int right = x;
while (left <= right){
int mid = (left + right) / 2;
// 需要转换为long,否则数值超过int的边界值,导致超时
if ((long) mid * mid <= x){
res = mid;
left = mid + 1;
}else{
right = mid - 1;
}
}
return res;
}
}

public class Test {
public static void main(String[] args) {
new Solution().mySqrt(4); // 输出: 2
new Solution().mySqrt(8); // 输出: 2
}
}