持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
「示例1:」
输入:x = 4
输出:2
「示例2:」
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
「提示:」
0 <= x <= 231 - 1
解题思路
// 二分法
根据题目让我们求x的算术平方根,而且x是一个非负整数,结果也是只保留整数部分,小数部分将全部被舍去
同时题目要求我们不可以使用pow(x,0.5)或者 x ** 0.5 这种函数
因此我们可以想到用二分法来解决这个题目
初始最小的变量为0,最大的变量为题目给定的x
通过最小变量和最大变量求一个中间值
如果中间值的平方大于x,则把中间变量赋值给最大变量,否则就是把中间变量赋值给最小变量
以此类推,当最大变量减去最小变量值为1的时候,我们即可返回最小变量,即最小变量就是我们需要求的值!
代码实现
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
let begin = 0; // 最小变量
let end = x; // 最大变量
if (x === 1 || x === 0) return x; // 特殊情况特殊处理
while (end - begin !== 1) { // 最大变量 - 最小变量 不等于1 的时候继续循环函数
let mid = Math.floor((begin + end) / 2); // 求的中间值,如果为小数向下取整保留整数部分
if (mid * mid === x) return mid; // 如果中间变量的平方等于最大变量,则说明中间变量就是题目给定数的算术平方根
if (mid * mid < x) { // 如果中间变量的平方 小于 题目给定的值,就把中间变量赋值给最小变量,否则就是把中间变量赋值给最大变量
begin = mid;
} else {
end = mid;
}
}
return begin; // 最后,最小变量即是我们所求的值
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;