一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情。
一、题目
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sq… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路
- 二分查找
-
定义左右区间,left = 0, right = x, 定义中间值mid
-
mid = left + ((right - left)>>1)
-
增加部分是用移位运算符,防止溢出
-
有三种情况
-
当mid*mid === x, 返回Math.floor(mid)
-
当mid*mid < x, 左区间等于mid + 1
-
当mid*mid > x, 这是就取到了平方后最接近x的值
-
right = mid -1 最后返回right
- 移位算法符
- 分别有<<左移位运算符,效果是数值增大,>>右移位运算符,效果是数值减小,还有个>>>执行无符号右移位运算。 原理是把数字转换成二进制,比如 2 转换为二进制就是10, 向右移动一位就是01,写作:2>>1, 左移位运算符同理
-
三、代码
// let x = 8
// let x = 4
let x = 9
let mySqrt = function(x) {
/**
* 二分查找
* 定义左右区间,left = 0, right = x, 定义中间值mid
* mid = left + ((right - left)>>1)
* 增加部分是用移位算法,防止溢出
* 有三种情况
* 当mid*mid === x, 返回Math.floor(mid)
* 当mid*mid < x, 左区间等于mid + 1
* 当mid*mid > x, 这是就取到了平方后最接近x的值
* right = mid -1 最后返回right
*
* */
let left = 0, right = x
while(left <= right) {
let mid = left + ((right - left)>>1)
let result = mid*mid
if(result == x) {
return Math.floor(mid)
} else if(result > x) {
right = mid - 1
} else {
left = mid + 1
}
}
return right
}
mySqrt(x)