给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
示例 3:
输入:808201
输出:true
解释: 899
解法一:
通过累加从1到大的数字乘积来判断是不是大于或者等于目标数,等于返回ture,大于false。
var isPerfectSquare = function(num) {
for(var i=0;i>-1;i++){
var square = i*i;
if(square==num) return true;
if(square>num) return false;
}
};
68 / 68 个通过测试用例
执行用时:84 ms
解法二:
与前面的方法一样,只是减少了循环的次数,在测试用时上有明显的区别,
需要注意的是,x==0要优先判断,因为放那后面的话那程序就会每次都计算square*square的结果增加循环中的计算量
// 2018/11/17 Sat 晚上
var isPerfectSquare = function(num) {
var x=0;
for(var i=0;i>-1;i++){
var square = i*i;
if(square>=num) break ;
if(x==0 && square*square<num){
i=i*i;
}else{
x=1
}
}
return square==num?true:false
};
68 / 68 个通过测试用例
执行用时:64 ms
解法三:
二分查找法,先找到最中间的数字,目标值大于中间的数,则在中间值与最高值之间找,目标值小于中间数,则在最低与中间之中找,通过不过折半最终找到目标值。较低的值每次拆半都加1,而较高的值每次都减1,当两个数大小超过临界了就返回false。
// 2018/11/17 晚上
var isPerfectSquare = function(num) {
var low=1,hig=num,mid;
while (low<=hig) {
mid=Math.ceil((low+hig)/2)
if(mid*mid==num) return true;
if(mid*mid<num){
low=mid+1
}else{
hig=mid-1
}
}
return false;
};
68 / 68 个通过测试用例
执行用时:84 ms
*解法四:
最简洁,没有之一
扫描二维码关注公众号,回复:
4176972 查看本文章
var isPerfectSquare = function(num) {
for(var i=1; i<= num/i; i++){
if(i*i == num) return true
}
return false
};
68 / 68 个通过测试用例
执行用时:84 ms