在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. struts2进阶篇(4)

    一.使用ActionContext访问Servlet API strtus2提供了一个ActionContext类,该类别称为Action上下文或者Action环境,Action可以通过该类来访问最常 ...

  2. #define lowbit(x) ((x)&(-x))原理详解

    #define lowbit(x) ((x)&(-x)) 也可以写成如下形式: int Lowbit(x) { return x&(-x); } 例如: 1> x = 1: 十进 ...

  3. PPP模式下的融资结构优化

    PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...

  4. 初识Asp.net Identity

    第一篇,多多指教啦! 之前做asp.net的网站只知道Asp.net的身份验证方式有:Windows验证和Forms验证.今天初步了解了下asp.net的Identity技术,顺带了解了它之前的Mem ...

  5. css导航栏

    几个导航栏也算对学过知识的回顾,总有新的收获,下面是学习过程中敲的代码: <!DOCTYPE HTML> <html> <head> <title>&l ...

  6. 用构造函数创建对象时的this的指向问题

    用构造函数方式创建对象: function Person(name,age){ this.name=name; this.age=age; this.sayname=function(){ alert ...

  7. 滴滴DSRC抢楼大赛,十一快车券飞起来

    十一马上就要到了 不管你想要去哪里 总少不了滴滴打车 DSRC为你准备了30份快车券 现在开始参与抢楼,就有机会得到 活动时间: 本帖发布之时起-9月30日12:00 参与方式: 关注微信公众号“滴滴 ...

  8. C中的一些经常会用到的函数

    1.sscanf 函数原型: int sscanf(const char *,const char *,...); int sscanf(const char *buffer,const char * ...

  9. 【转载】iOS堆和栈的理解

    操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme ...

  10. IOS 网络浅析-(四 get&post)

    网络请求默认是get 网络请求有很多种:GET查  POST改  PUT增  DELETE删 HEAD 在平时开发中主要用的 是 get 和 post. get 获得数据 (获取用户信息) get 请 ...