持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
题目
给你一个非负整数 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));
};
坚持努力,无惧未来!