题目出处:https://leetcode.com/problems/sqrtx/
题目描述:
计算并返回x的平方根,其中x保证为非负整数。
由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分。
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
代码:
var mySqrt = function (x) {
//查找数字的开头start,查找数字的结尾end。自己建立的检测索引mid,同时也是中间值
let start = 0;
let end = x;
let mid = 0;
while (start <= end) {
//给中间值定值,最小2分法嘛,就折中比较。
mid = Math.floor((start + end) / 2);
console.log(mid);
//对中间数mid进行判断,如果mid*mid<=x<(mid+1)*(mid+1)则符合条件
if (Math.pow(mid, 2) <= x && x < Math.pow(mid + 1, 2)) {
console.log(mid);
return mid
//否则就对应的修改2分发的左边界限或者右边界限
} else if (Math.pow(mid, 2) < x) {
start = mid + 1
} else {
end = mid - 1
}
}
//提交报错,因为没考虑0,给0加上定义
// if(x == 0) return 0 这样提交又会提示input 1 output undefined
//由于以上2点,我发现0和1代入时,我定义的start 和 end是相等的,
//所以x=0,x=1无法进入while循环,
//把循环条件更改:while (start < end) ==> while (start <= end)
};
console.log(mySqrt(8));
思路:
最小2分法,佐界限0,右界限传入数字本身,通过中间值进行比较判断,因为条件很明确,不符合条件再对应的修改佐界限或者右界限。
笔记:
1.if 判断的条件:Math.pow(mid, 2) <= x && x < Math.pow(mid + 1, 2),不能写成日常的连写,
Math.pow(mid, 2) <= x < Math.pow(mid + 1, 2)这种是错的。