在Codewars上面练习,现在到6级的题目了(数字越小越难)

这道题叫Harshad or Niven numbers,

原题http://www.codewars.com/kata/54a0689443ab7271a90000c6/train/javascript (可以先自己做做看哦)

Harshad number就是一个数可以被自己各个位上的数之和整除的数

比如588, 5 + 8 + 8 = 21,588 =21 * 28

题目是建立一个对象,有三个方法,

isValid(number)判断是否是Harshad number // Harshad.isValid( 1 ) returns true

getNext (number) 返回下一个Harshad number// Harshad.getNext( 0 ) returns 1

getSerie(count, start) 传入两个参数,一个是数量,一个是起始点(可选) 返回一个数组

// Harshad.getSerie( 3, 1000 ) returns [ 1002, 1008, 1010 ], while // Harshad.getSerie( 3 ) returns [ 1, 2, 3 ]

测试用例的范围是前2000个Harshad Number

以下是我的实现代码

var Harshad = ( function() {
'use strict';
//定义一个空集
var arr=[];
//循环初始值i
var i=0;
//当数组长度小于等于2000时执行循环
while(arr.length<2000) {
//求得各位数值的和
var digitSum=i.toString().split("").reduce(function(a,b){
return parseInt(a)+parseInt(b);
});
//如果可以整除,则加入数组中
if(i%digitSum===0){arr.push(i);}
i++;
}
return {
isValid: function( number ) {
return arr.indexOf(number)!==-1;
},
getNext: function( number ) {
return arr[arr.indexOf(number)+1];
},
getSerie: function( count, start ) {
start=start||0;
var filterArr=arr.filter(function(b){
return b>start;
});
return filterArr.slice(0, count);
}
}; } () );

一.求各数值的和

var digitSum=i.toString().split("").reduce(function(a,b){
return parseInt(a)+parseInt(b);
});

这一段我的思路是,先把i 转换为字符串,然后用split将各位分割开,再用数组的reduce函数,将各个字符串转回数字后相加

关于reduce函数,参见张鑫旭大大的http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/#indexof

二.进行测试时遭遇的两个小陷阱

1.getSerie方法传的参数start可能不是Harshad数,所以我是用filter方法(用法也参见上一个链接),把原数组截成了大于start这个数的数组

2.坑还是在这个start上,这个参数是可选的,有些测试用例没有传,也就是默认是0。由于codewars支持es6语法,所以最简单的是

getSerie: function( count, start=1 )

不过如果还没用babel,还不支持ES6,就加这么一句

start=start||0;

这就是传统的设置默认参数的方法了

这道题就学到这里啦

每天进步一点点:)

个人简历:wzlinsen.com

 

JS练习题-Harshad numbers的更多相关文章

  1. JS练习题 显示登入者相关好友

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. JS练习题(左侧菜单下拉+好友选中)

    题一.左侧菜单下拉 做题思路:先做菜单和子菜单,把子菜单默认隐藏.再用JS调样式. <style type="text/css"> *{ margin:0px auto ...

  3. js练习题笔记

    javascrip测试题: 一.选择题(每题2分,多选题错选.少选不得分) 1.分析下段代码输出结果是( )    var arr = [2,3,4,5,6];    var sum =0;    f ...

  4. leetcode—js—Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  5. JS练习题

    1.带参数的函数不能重复调用 2.顺序语句: 3.在重复调用中打断 调用用 return   例如: Interval 时间间隔   先清一下  再接着 return:其他的调用也可以加return打 ...

  6. JS练习题2共8题

    <p>1 打印出1-100里所有的偶数</p> <script> // for(var i=1;i<=100;i++){ // if(i%2==0){ // ...

  7. JS练习题1共7题

    <p>1 一个新人入职,月工资为2000元的员工,每年涨工资5%,到退休时的月工资是多少?</p> <script> document.write(Math.rou ...

  8. Js练习题之字数判断

    目标:控制某个栏目里每行字数,当字数超出时,以省略号显示 $("元素").each(function(){ var maxlength=9; //最大字数 if($(this).t ...

  9. Js练习题之查找字符串中出现最多的字符和个数

    如sssfgtdfssddfsssfssss,出现最多的字符是s,出现了12次 传统写法 分析: 1.准备一个空的json,通过循环字符串的每个字符来看,如果json里没有这个字符,就在json里创建 ...

随机推荐

  1. spring详解(1)

    1.  什么是spring? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发 ...

  2. C#常用集合的使用(转载)

    大多数集合都在System.Collections,System.Collections.Generic两个命名空间.其中System.Collections.Generic专门用于泛型集合. 针对特 ...

  3. java微信开发(wechat4j)——wechat4j配置文件解读

    wechat4j的配置文件是wechat4j.properties.需要放置在项目src目录下.在wechat4j.jar中的META-INF下有一个wechat4j.properties.sampl ...

  4. 使django与数据库保持长连接

    最近遇到一个很蛋疼的问题,写了一个后台管理系统, 由于是后台管理系统,所以使用频率不是很高,当django程序在闲置一段时间后,再次打开后台系统,就变得很慢,然后又好了.查了很多方面,从模板引擎到请求 ...

  5. 关于setInterval和setTImeout中的this指向问题

    前些天在练习写一个小例子的时候用到了定时器,发现在setInterval和setTimeout中传入函数时,函数中的this会指向window对象,如下例: var num = 0; function ...

  6. JavaScript基础11——js的全局函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. jQuery对复选框(checkbox)的全选,全不选,反选等的操作

    效果截图: HTML代码: <body><ul id="list"> <li><label><input type=" ...

  8. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q121-Q124)

    Question 121You develop a custom approval workflow. The workflow uses the CreateTask class to assign ...

  9. NodeJS: 处理request网页乱码问题

    对于gb2312编码的网页,直接用request去获取会得到乱码的结果,解决方法很简单: 1. npm install iconv-lite 2. var iconv = require('iconv ...

  10. IOS 网络浅析-(九 NSURLSession代理简介)

    从最开始什么都不懂的小白,到到现在略知一二的小孩.我觉得不仅仅是我,大家应该都会注意到代理几乎贯穿着IOS,那么问题来了,我接下来要说什么呢,那就是.标题的内容啦.上篇网络系列的文章我介绍了NSURL ...