题目如图:

先展示代码:
import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param x int整型
     * @return int整型
     */
    public int sqrt (int x) {
        if(x<2){
            return x;
        }
        int left = 1;
        int right = x / 2;
        while (left < right) {
            int mid = left + (right - left+1) / 2;
            int temp = x / mid;
            if (mid <= temp) {
                left = mid;
            } else{
                right=mid-1;
            }
        }
        return left;
    }
} 
该代码使用的方法是二分法
思路:
1.因为当x取0或1时,0或1的平方根都是自身,所以先将这两个特殊情况筛选出来
2.由于是向下取整,所以除了0和1以外,x的平方根最大肯定都不会超过自身的一半,因此x平方根的取值范围是1-x/2
3.求出在left和right中的中点mid,但计算mid时要用(left+right+1)/2,因为(left+right)/2在很多情况下会造成死循环(不相信可以代入4或9尝试一下),而mid = left + (right - left+1) / 2则是为了防止溢出的写法
4.通过temp=x/mid所得到的值与mid进行比较可以判断mid此时对于x的平方根来说是小还是大,如果mid的值大于temp就说明mid较大,反之则较小,但由于是向下取整,所以当mid较小时也有可能是要取得的平方根所以取范围的右边时设left=mid,但若mid较大,该mid就不可能是满足条件的,所以取范围的左边时取right=mid-1
5.当left与right相遇时便得到了x的平方根,返回left的值即可



















