[CodeWars][JS]如何判断给定的数字是否整数
问题描述:
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]如何判断给定的数字是否整数的更多相关文章
- js中判断输入的数字是否是数值类型
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...
- JS中判断是中文数字的函数
function checkcnnum(str) { ; const zh = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九','十','百','千 ...
- js判断只能输入数字和只能输入
JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...
- JS判断只能是数字和小数点
JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...
- js判断是否是正整数,js判断是否是数字
//判断字符串是否为数字 function checkRate(input) { var re = /^[0-9]+.?[0-9]*$/; if (!re.test(input.rate.value) ...
- js判断只能输入数字或小数点
JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...
- 关于JS中判断是数字和小数的正则表达式用法
关于JS中判断是数字和小数的正则表达式用法 正则表达式 正则表达式是由一个字符序列形成的搜索模式. 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容. 正则表达式可以是一个简单的字符,或一 ...
- js 判断是不是数字||判断字符串是不是数字(正则表达式)
js使用正则表达式判断对象是不是数字,或者字符串是不是数字,或者是不是数字类型 //判断是不是一个数字 或者 一个字符串里全是数字 isNumber (value) { if (value === u ...
- 一个简单的JS函数,用于判断文本是否数字
/****************************************************** 判断是否是数字(整数,小数均可,不包括负数)* 2014年10月10日22:38:19* ...
随机推荐
- [LeetCode] Jump Game 跳跃游戏
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- angular js 在ie11 下的get请求缓存问题的解决办法
使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...
- 支持同步滚动的RichTextbox控件
using System.Windows.Forms; public class SynchronizedScrollRichTextBox : System.Windows.Forms.RichTe ...
- 用jQuery获取表单的值
在日常开发过程中,有许多用到表单的地方.比如登录,注册,比如支付,填写订单,比如后台管理等等. 使用jQuery来获取表单的值是比较常见的做法. 常见表单 单行文字域:<input type=' ...
- JSP中编译指令include与动作指令include的区别
include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改, 否则视为已被修改.由于被包含的文件是在编译时才插入的,因此如 ...
- Android自定义九宫格图案解锁
转自: http://blog.csdn.net/shineflowers/article/details/50408350
- HTML5射击类游戏----【地球保卫战】
在线DEMO地址:打开: 游戏截图: 就不贴代码了, 因为代码太多了, 大概写一下这个游戏实现思路和一些实现: 游戏一共有三关, 每一关都有一个大Boss, Boss比较好杀,主要各种外星飞 ...
- 高通vuforia+Unity3D 制作ar app
很简单就可以用Unity3D做出增强现实的一个小例子 新人第一次写博客,若出现错误望指正^_^ 需要下载de东西: unity3d 5.0 http://unity3d.com/get-unity ...
- sql查询,不在某一范围问题的新思路
新思路: A为学生表 B为中间表(学生和课程的) C为课程表 新的思路是用left join,(right join应该也可以) 查询没有选课的学生 ... C left join B on A.si ...
- zlib-1.2.7/libpng-1.5.9 instead of zlib-1.2.8/libpng-1.6.6
The reason for the failure apparently appears to be version incompatibility, partly may be due to li ...