x的平方根

128 阅读1分钟

x的平方根

说明

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

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

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

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
  • 提示:

    • 0 <= x <= 231 - 1

来源:力扣(LeetCode) 链接:leetcode.cn/problems/sq…

题解

解法一

思路:根据计算出的规则:

  • 1.2长度的数字的算术平方根在 0-9这个范围 10 ^ 1
  • 3、4长度的数字的算术平方根在 10 - 99这个范围 10 ^ 2
  • .....
  • 9,10长度的数字的算术平方根在 10000 - 99999这个范围 10 ^ 5
  • ......
    public static void main(String[] args) {
        int x = 94354;
        System.out.println(demo(x));
    }
​
    public static int demo(int x){
        if(x == 1)
            return 1;
        int length = (x+"").length();
        if(length % 2 == 1){
            length = length / 2 + 1;
        }else{
            length /= 2;
        }
        long min = 0;
        if(length == 1){
            for (int i = 0; i < 11; i++) {
                if(i * i > x){
                    return  i - 1;
                }
            }
        }else{
            min = 1;
            for (int i = 0; i < length-1; i++) {
                min *= 10;
            }
            long max = min * 10 - 1;
            for (long i = min; i < max; i++) {
                //这里: x = i * ? ---> ? = x / i 
                //当?等于 i的时候,就表示 i 是x的算术平方根
                //当 ? 小于 i的时候,i * ? > x,因为是取小,所以 i - 1 = ?
                long number = x / i;
                if(number < i){
                    return (int) i-1;
                }else if(number == i){
                    return (int) i;
                }
            }
        }
​
        return (int) min;
    }

解法二

二分查找,力扣大佬写的

        if(x == 1)
            return 1;
        int min = 0;
        int max = x;
        while(max-min>1)
        {
            int m = (max+min)/2;
            if(x/m<m)
                max = m;
            else
                min = m;
        }
        return min;