zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    碰撞器与触发器[Unity]
    Mesh属性[Unity]
    4.3之后的PingPong效果实现
    windows reload()
    浏览器的内核
    redis 1
    oauth 2.0转
    java 散列
    js 事件详解 冒泡
    HttpURLConnection和HttpClient的区别2(转)
  • 原文地址:https://www.cnblogs.com/wzls/p/5327125.html
Copyright © 2011-2022 走看看