问题描述:

We are asking for a function to take a positive integer value, and return a list of all positive integer pairs whose values - when squared- sum to the given integer.

For example, given the parameter 25, the function could return two pairs of 5,0 and 3,4 because 5^2 + 0^2 = 25 and 3^2 + 4^2 = 25.

We might express that in pseudo-code like this:

allSquaredPairs(25) == [[5,0],[3,4]];

题目本身比较简单,就是给定一个整数,求出平方和等于该整数的两个数的序列。

解法

方法1:遍历所有数字以得到结果

function allSquarePairs(num){
var temp = Math.sqrt(num);
var result = [];
for(var i=0; i<=temp; i++){
for(var j=i; j<=temp; j++)
if(i*i+j*j==num)
result.push([i,j]);
}
return result;
}

然而虽然这个方法是正确的,却无法通过测试。因为这个算法的复杂度还是蛮大的,遇到很大的num就得花比较久的时间才能得出结果了。

那么怎么降低复杂度呢?我觉得问题主要出在j的遍历上。对于每个i,j都得从头遍历一次,这显然贡献了不少的计算量。

我想了想,或许可以用二分查找,每给定一个i,就在i与temp之间取中值,若j太大,则在前一个区间继续遍历;太小,则换成下一个区间。

正当我绞尽脑汁地想怎么完美地植入二分法的时候,忽然灵光一闪,其实根本没有必要这么复杂的:给定了一个i之后,其实我们可以通过计算直接得出j的值,完全没有必要遍历的……

方法2: 直接计算j的值

function allSquaredPairs(num) {
var temp = Math.sqrt(num);
var result = [];
var j=0;
for(var i=0; i<=temp; i++){
j=Math.sqrt(num-i*i);
if(isInt(j) && j>=i)
result.push([i,j]);
}
return result;
}

以上,遍历i的时候,通过计算(num-i^2)的平方根,判断是否为整数,如果是,则得到了一组值,否则继续检索。如此一来少了一个循环计算量就大大减少了,顺理成章地通过了测试。

改进

1> isInt()的实现

上面的代码中isInt()表示判断一个数字是否为整数,是则返回true,否则为false。

当然这里没必要使用过函数,用简单的表达式会更方便一些,这里只是为了占个位。

那么问题来了,怎样判断一个数字是否为整数呢?

在玩这道题之前,我知道有这些方法:

a>Math.floor(num) == num

对给定的数字取整,如果与原来的数字相等,则为整数。

b>parseInt(num) == num

和上面一样的,只不过使用不同的方法

c>"^-?//d+$"

当然还可以使用强大的正则表达式。

做完这道题之后我才意识到还有更简洁的形式:

d>num == num | 0

num | 0 舍弃了小数部分,和Math.floor()有些相似。不过还是不一样的,如果num是负数的时候区别就出来了。

f>num == ~~num

和上面一样的~

g>num == num>>0

同上~

g>num%1 == 0

与上面的几个方法相反,这里检测的是小数部分。

2> 冗余的判断条件

在isInt()的旁边我们还做了一个j>i的条件,以此避免出现重复序列,比如[0,5]和[5,0]。

实际上这点完全可以在设置temp的值时就过滤掉。只要让temp=Math.sqrt(num/2)而不是temp=Math.sqrt(num),就可以去掉后面这个j>i的条件了。

[CodeWars][JS]如何判断给定的数字是否整数的更多相关文章

  1. js中判断输入的数字是否是数值类型

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...

  2. JS中判断是中文数字的函数

    function checkcnnum(str) { ; const zh = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九','十','百','千 ...

  3. js判断只能输入数字和只能输入

    JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...

  4. JS判断只能是数字和小数点

    JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...

  5. js判断是否是正整数,js判断是否是数字

    //判断字符串是否为数字 function checkRate(input) { var re = /^[0-9]+.?[0-9]*$/; if (!re.test(input.rate.value) ...

  6. js判断只能输入数字或小数点

    JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...

  7. 关于JS中判断是数字和小数的正则表达式用法

    关于JS中判断是数字和小数的正则表达式用法 正则表达式 正则表达式是由一个字符序列形成的搜索模式. 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容. 正则表达式可以是一个简单的字符,或一 ...

  8. js 判断是不是数字||判断字符串是不是数字(正则表达式)

    js使用正则表达式判断对象是不是数字,或者字符串是不是数字,或者是不是数字类型 //判断是不是一个数字 或者 一个字符串里全是数字 isNumber (value) { if (value === u ...

  9. 一个简单的JS函数,用于判断文本是否数字

    /****************************************************** 判断是否是数字(整数,小数均可,不包括负数)* 2014年10月10日22:38:19* ...

随机推荐

  1. go channel

    channel 是go语言中不同goroutine之间通信一种方法 //定义一个channel c := make(chan bool) //向channel中写入 c <- true //读取 ...

  2. php杂项

    php5.3新增闭包函数用法use用法(引入变量地址且随内存中值变化而变化,跳过解析顺序直接获取函数最终值) $obj = (object) "Hello, everyone"; ...

  3. IO流-----写到输出流

    输出流:---链接:http://blog.csdn.net/du_minchao/article/details/49045421 /** * 方法名:writeStream * 方法描述:写到输出 ...

  4. 移动端开发viewport深入理解(转)

    一.viewport的概念   移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,就是浏览器上用来显示网页的那部分区域,但viewport不局限于浏览器可视区域 的大小,它 ...

  5. [HTML5] Blob对象

    写在前面 本篇主要总结Blob对象属性及作用,通过DEMO介绍Blob对象的应用场景. Blob对象 一直以来,JS都没有比较好的可以直接处理二进制的方法.而Blob的存在,允许我们可以通过JS直接操 ...

  6. Android Studio导入项目遇到的问题

    [ Failed to resolve: com.afollestad:material-dialogs:0.7.5.5] 解决办法: 1.打开app目录下的build.gradle文件,然后在and ...

  7. Scala中apply的用法

    Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...

  8. [WP8.1开发]RSA 使用BouncyCastle 公钥解密

    写应用的时候遇到个服务器返回私钥加密过的数据 ,然后要在客户端用公钥解密的需求 ,一直没找到方法,应用搁置了一个学期,多方搜索,结论就是.net没有实现公钥解密的方法,要自己实现,于是硬着头皮开始看B ...

  9. HTML5学习总结-番外04 Cordova/PhoneGap

    一 PhoneGap 1 PhoneGap简绍 http://www.cnblogs.com/JustRun1983/p/3819433.html 2 环境安装 http://cordova.apac ...

  10. 如何使用DOS命令(cd命令)

    如何使用DOS命令 DOS是Disk Operation System(磁盘操作系统)的简称,是个人计算机上的一类操作系统.它直接操纵管理硬盘的文件,一般都是黑底白色文字的界面.顾名思义,DOS主要是 ...