Leetcode 69. Sqrt(x) -- 求整数的算术平方根,返回整数,把小数位截断

版权声明:本文为博主原创文章,转载请说明出处 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

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/86365083