题目
给你一个非负整数 x ,计算并返回 x 的 算术平方根 ,由于返回类型是整数,结果只保留整数部分 ,小数部分将被 舍去 ,不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
输入: x = 8 输出: 2 解释: 8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
题解
这里我们采用二分查找的方式进行实现,我们进入函数后先使用if
语句判断当前出参x
是不是等于0
,如果等于0
则直接将出参x
返回出去,在声明两个变量,分别是left
变量和right
变量,left
变量的值我们默认为1
,right
变量值默认为出参x
减去1
,在使用while
进行循环,循环条件为当前left
变量加1
小于right
变量,在循环中我们声明一个mid
变量,他的值为left
变量加上当前right
变量减去left
变量除以2
最后使用Math.floor
方法向下取整后的数,然后在使用if
语句进行判断当前mid
变量乘以mid
变量后的值是否等于出参x
,如果等于则直接将mid
变量返回出去,不满足则往下判断当前mid
变量乘以mid
变量后的值是否小于出参x
,如果小于则将mid
变量的值赋值到left
变量,最后则判断当前mid
变量乘以mid
变量后的值是否大于出参x
,如果大于则将mid
变量的值赋值到right
变量,最后使用Math.floor
方法将left
变量值向下取整后返回出去
/** * @param {number} x * @return {number} */ var mySqrt = function(x) { if(x == 0) { return x } let left = 1, right = x - 1 while(left + 1 < right) { let mid = left + Math.floor((right - left) / 2) if(mid * mid === x){ return mid } if(mid * mid < x) { left = mid } if(mid * mid > x) { right = mid } } return Math.floor(left) };
我们也可以直接使用Math
数学函数进行实现,我们先用Math.sqrt
方法获取到出参x
的平方根,在使用Math.floor
函数对Math.sqrt
方法返回数进行向下取整,主要是防止通过Math.sqrt
方法获取的是一个带小数点的数
/** * @param {number} x * @return {number} */ var mySqrt = function(x) { return Math.floor(Math.sqrt(x)); };