JS練習題-Harshad numbers

来源:http://www.cnblogs.com/wzls/archive/2016/03/27/5327125.html
-Advertisement-
Play Games

在Codewars上面練習,現在到6級的題目了(數字越小越難) 這道題叫Harshad or Niven numbers, 原題http://www.codewars.com/kata/54a0689443ab7271a90000c6/train/javascript (可以先自己做做看哦) Har ...


在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

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 翻譯前言:我在理解複雜事件處理(CEP)方面一直有這樣的困惑--為什麼這種計算模式是有效的,能夠分析得到有用的結果?為什麼它會快?我始終還沒有找到我期望的答案。不像map-reduce模型,google的論文非常清楚的描述了它的場景;或者disruptor框架,原作者清晰地解釋了它為什麼會快。在試圖... ...
  • 什麼是ORM框架: ORM即對象關係映射(Object Relational Mapping,簡稱ORM),是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和資料庫之間映射的元數據,將程式中的對象自動持久化到關係資料庫中。 自己也用過很多ORM框架,比 ...
  • Atitit.木馬病毒 webftp 的原理跟個設計 ftp木馬的效果 文件傳播 文件列表 文件內容查看 作者:: ★(attilax)>>> 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍, EMAIL:1466 ...
  • Atitit。Cas機制 軟體開發 編程語言 無鎖機制 java c# php 1. 為什麼需要無鎖操作1 2. 硬體支持 cas atomic2 3. 無鎖編程(Lock-Free)就是在某些應用場景和領域下解決以上基於鎖機制的併發編程的一種方案。3 4. Volatile 記憶體屏障(Memory ...
  • 中介者要解決的問題 中介者模式(Mediator Pattern)是用來降低多個對象和類之間通信的複雜度。這種模式提供了一個中介類,該類通常用來處理不同類之間的通信。中介者模式符合迪米特原則,即一個類應當儘量減少與其他類的聯繫。 實例描述 在我們現實生活中就有這樣的例子,你如果去租房,你可能會在網站 ...
  • 管道和過濾器 管道和過濾器是八種體繫結構模式之一,這八種體繫結構模式是:層、管道和過濾器、黑板、代理者、模型-視圖-控制器(MVC) 表示-抽象-控制(PAC)、微核、映像。 管道和過濾器適用於需要漸增式處理數據流的領域,而常見的“層”模式它 能夠被分解成子任務組,其中每個子任務組處於一個特定的抽象 ...
  • 原型模式(Prototype) 類圖 描述 原型模式: 提供一個克隆自身的介面--Clone方法。 應用場景 定義一個學生類,包含一個值類型(int)的Age屬性、兩個引用類型Name(string)和Course屬性。 輸出: student:Jim 20 C++ student:Jim 20 C ...
  • css垂直居中屬性設置vertical-align: middle對div不起作用,例如: 運行後按鈕沒有在DIV中垂直居中: 解決思路:如果div和按鈕的寬高都確定為具體像素值,可以直接設定按鈕的css屬性:position:relative; top為(div.height - button.h ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...