java实现“求平方根”

163 阅读2分钟

java实现“求平方根”

题目要求:

实现函数 int sqrt(int x). 计算并返回 x 的平方根(向下取整) 数据范围: 0 <= x < 231−1 要求:空间复杂度 :O(1),时间复杂度 :O(logx)

示例1

输入:

2

复制

返回值:

1

复制

示例2

输入:

2143195649

复制

返回值:

46294

思路:

题外话:首先这题的意图就是让我们实现一个sqrt方法.所以不能用库函数来解,如果是面试官出的题,这也是他们最不希望看到的.

这个题目拿到后我们可以先找一下规律
0,1的平方根为本身
2,3的平方根小于3的一半
4的平方根为2
比4大的数(这里用 n 表示)的平方根都小于n / 2
那么就可以使用二分法来做.这也是我拿到这个题目的第一想法.

确定好思路之后就开始编写代码

  1. 先处理特殊情况 x = 1, x = 0;
  2. 编写核心代码:使用二分法找出平方根
  3. 返回值

当然这题有很多需要注意的细节,不然在各大刷题平台通过率也不会达到33%

  1. 我们知道二分法的几种表达式第一种为 mid = (left + right) / 2,这种表达式在做题中其实用的最少,原因也很简单,当left和right很大时怕越界.可以代替为mid = low + ((high - low) >> 1).或者mid = left + (right - left) / 2;
    还有一个为mid = left + (right - left + 1) / 2;这个(right - left + 1)和上面的区别就是能保障 mid 处在中间数靠右的位置(也就是向上取整),例如正常的(int) mid = 3 + (10 - 3) / 2 = 6,而用这个表达式为 mid = 3 + (10 - 3 + 1) / 2 = 7;这个细节在一定的情况下可以提示代码的效率,例如这题.
  2. 在写判断条件时,肯定是将大概率的事件写在前面,这样可以减少代码的执行量.所以在这题中,因为n>4之后的平方根都在n / 2的左边,更大的n他的平方根可能要在n / 4或者更左边,所以我们肯定是先判断向左二分的这种情况.因此写代码也要这样写.

代码