问题描述:

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. 调用altera IP核的仿真流程—上

    调用altera IP核的仿真流程—上 在学习本节内容之后,请详细阅读<基于modelsim-SE的简单仿真流程>,因为本节是基于<基于modelsim-SE的简单仿真流程>的 ...

  2. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  3. ajax处理缓冲问题

    1.禁止页面缓存 header("Cache-Control:no-cache"); header("Pragma:no-cache"); header(&qu ...

  4. framebuffer line_length 參數

    以下是在 trace 關機充電動畫所遇到一個疑惑, 關於 framebuffer device 的屬性 line_length 大小值, 一個 display panel,1920 × 1080, 每 ...

  5. web前端面试总结

    本文由我收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的! 前端还是一个 ...

  6. .Net Core Logger 实现log写入本地文件系统

    .net core 自带一个基础的logger框架Microsoft.Extensions.Logging. 微软默认实现了Microsoft.Extensions.Logging.Console.d ...

  7. jQuery之回调对象

    1. jQuery 1.7 版本中新增的 jQuery.Callbacks() 函数返回一个全能的对象,此对象对管理回调列表提供了强大的方式.它能够增加.删除.触发.禁用回调函数. 2. callba ...

  8. [转]extjs组件添加事件监听的三种方式

    原文地址:http://blog.csdn.net/y6300023290/article/details/18989635 1.在定义组件配置的时候设置 xtype : 'textarea', na ...

  9. React JS的基本用法[ES5,纯前端写法]

    1.配置webpack npm install -g webpack #webpack的cli npm install -g webpack-dev-server #webpack自带的服务器 npm ...

  10. grails 优缺点分析

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring.Hibernate等开源框架之上,是一个高生产力一站式框架. 易于使用的基于Hibernate的对 ...