• Skip to primary navigation
  • Skip to main content

桓桓鄉寇

如果一開始沒有高牆,就沒有所謂的侵略了嗎?

  • 首頁
  • WordPress 筆記
  • 主機
  • 前端
  • 意見回饋
You are here: 首頁 / 前端 / Codewars 練習 03:數值的展開形式

Codewars 練習 03:數值的展開形式

2020-11-07 by Eric Chuang Leave a Comment

內容目錄

  • 問題
  • 我的作法
  • 投票評選最好的解法
  • 改善點
    • 用 console.time() 測試執行時間

問題

列出數值的展開形式:將一個數值,以十進位的方式拆解成不同的值相加。譬如 135 會拆解成 100 + 30 + 5。

我的作法

function expandedForm( num ) {
  let arr = [],
      ten = 0;
  while( num > 0 ) {
    arr.push( num % 10 * Math.pow( 10, ten ));
    num = Math.floor( num / 10 );
    ten++;
  }
  return arr.reverse().filter( num => { return num > 0 }).join( ' + ' );
}

投票評選最好的解法

const expandedForm = n => n.toString()
                            .split("")
                            .reverse()
                            .map( (a, i) => a * Math.pow(10, i))
                            .filter(a => a > 0)
                            .reverse()
                            .join(" + ");

改善點

為了測試兩邊的效能相差多少,所以學會了新的偵錯技能:console.time()。

根據 console.time() 的結果,兩種方法執行上相差了 0.03 毫秒左右,也可以說兩者的效能相差了 22%:

expandedForm: 0.11083984375 ms
expandedForm2: 0.086181640625 ms

最主要的差異在於我使用了迴圈來執行運算,而其他人的作法則是將數字轉為字串後,用 map() 的方法一次全部變更。從這次的練習中,我注意到我寫程式的問題在於太急著用「迴圈」的方式來解。

關於陣列的運算,我還是要更熟悉 map()、reverse()、filter() 等等的用法。這也是太過依賴函式庫的我欠缺的練習吧。

用 console.time() 測試執行時間

要在主控台面板中呈現上述訊息,只需要在主控台裡執行以下程式碼即可。透過 console.time() 跟 console.timeEnd() 來測量函式執行的時間。

function expandedForm( num ) {
  let arr = [],
      ten = 0;
  while( num > 0 ) {
    arr.push( num % 10 * Math.pow( 10, ten ));
    num = Math.floor( num / 10 );
    ten++;
  }
  return arr.reverse().filter( num => { return num !== 0 }).join( ' + ' );
}
console.time('test1'); //在主控台要顯示的標籤名稱
expandedForm(1789342003);
console.timeEnd('test1');

function expandedForm2( num ) {
    return num.toString()
              .split("")
              .reverse()
              .map( (a, i) => a * Math.pow(10, i))
              .filter(a => a > 0)
              .reverse()
              .join(" + ");
}
console.time('test2'); //在主控台要顯示的標籤名稱
expandedForm2(1789342003);
console.timeEnd('test2');

所屬分類: 前端 標籤: Codewars

關於 Eric Chuang

正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

讀者互動

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料。

Copyright © 2021 · Genesis Sample on Genesis Framework · WordPress