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
JS练习题-Harshad numbers的更多相关文章
- JS练习题   显示登入者相关好友
		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - JS练习题(左侧菜单下拉+好友选中)
		
题一.左侧菜单下拉 做题思路:先做菜单和子菜单,把子菜单默认隐藏.再用JS调样式. <style type="text/css"> *{ margin:0px auto ...
 - js练习题笔记
		
javascrip测试题: 一.选择题(每题2分,多选题错选.少选不得分) 1.分析下段代码输出结果是( ) var arr = [2,3,4,5,6]; var sum =0; f ...
 - leetcode—js—Add Two Numbers
		
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
 - JS练习题
		
1.带参数的函数不能重复调用 2.顺序语句: 3.在重复调用中打断 调用用 return 例如: Interval 时间间隔 先清一下 再接着 return:其他的调用也可以加return打 ...
 - JS练习题2共8题
		
<p>1 打印出1-100里所有的偶数</p> <script> // for(var i=1;i<=100;i++){ // if(i%2==0){ // ...
 - JS练习题1共7题
		
<p>1 一个新人入职,月工资为2000元的员工,每年涨工资5%,到退休时的月工资是多少?</p> <script> document.write(Math.rou ...
 - Js练习题之字数判断
		
目标:控制某个栏目里每行字数,当字数超出时,以省略号显示 $("元素").each(function(){ var maxlength=9; //最大字数 if($(this).t ...
 - Js练习题之查找字符串中出现最多的字符和个数
		
如sssfgtdfssddfsssfssss,出现最多的字符是s,出现了12次 传统写法 分析: 1.准备一个空的json,通过循环字符串的每个字符来看,如果json里没有这个字符,就在json里创建 ...
 
随机推荐
- struts2进阶篇(4)
			
一.使用ActionContext访问Servlet API strtus2提供了一个ActionContext类,该类别称为Action上下文或者Action环境,Action可以通过该类来访问最常 ...
 - #define lowbit(x) ((x)&(-x))原理详解
			
#define lowbit(x) ((x)&(-x)) 也可以写成如下形式: int Lowbit(x) { return x&(-x); } 例如: 1> x = 1: 十进 ...
 - PPP模式下的融资结构优化
			
PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...
 - 初识Asp.net Identity
			
第一篇,多多指教啦! 之前做asp.net的网站只知道Asp.net的身份验证方式有:Windows验证和Forms验证.今天初步了解了下asp.net的Identity技术,顺带了解了它之前的Mem ...
 - css导航栏
			
几个导航栏也算对学过知识的回顾,总有新的收获,下面是学习过程中敲的代码: <!DOCTYPE HTML> <html> <head> <title>&l ...
 - 用构造函数创建对象时的this的指向问题
			
用构造函数方式创建对象: function Person(name,age){ this.name=name; this.age=age; this.sayname=function(){ alert ...
 - 滴滴DSRC抢楼大赛,十一快车券飞起来
			
十一马上就要到了 不管你想要去哪里 总少不了滴滴打车 DSRC为你准备了30份快车券 现在开始参与抢楼,就有机会得到 活动时间: 本帖发布之时起-9月30日12:00 参与方式: 关注微信公众号“滴滴 ...
 - C中的一些经常会用到的函数
			
1.sscanf 函数原型: int sscanf(const char *,const char *,...); int sscanf(const char *buffer,const char * ...
 - 【转载】iOS堆和栈的理解
			
操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme ...
 - IOS 网络浅析-(四 get&post)
			
网络请求默认是get 网络请求有很多种:GET查 POST改 PUT增 DELETE删 HEAD 在平时开发中主要用的 是 get 和 post. get 获得数据 (获取用户信息) get 请 ...