JS练习题-Harshad numbers
在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