2017-06-18 66 views
1

我正在運行CodeFight上的挑戰,除了1個「隱藏測試」,我無法看到插入的測試數據,所有測試都會通過... 我正在尋找幫助指出我錯過了或者我的解決方案失敗的測試用例。數字根分類算法

問題:

一些正整數的位數根被定義爲所有的 其位數的總和。我們給你一個整數數組。將它排序的方式是,如果 在b之前,則a的數字根小於或等於b的 數字根。如果兩個數字具有相同的數字根,則應該先排列較小的一個(按照常規意義)。例如4和13 具有相同的數字根,但是4 < 13因此4在任何 數字根分類中都出現在13之前,其中兩者都存在。

對於A = [13,20,7,4],輸出應該是[20,4,13,7]。

[時限] 4000ms(JS)[輸入] array.integer正整數的一個

陣列。

[輸出] array.integer

我的解決方案:

function digitRootSort(a) { 
    "use strict"; 

    function getDigitalRoot(n) { 
     let _dr = n 
      .toString() 
      .split('') 
      .reduce((acc, val, i) => { 
       return acc += parseInt(val) 
      }, 0) 
      .toString() 

     if (_dr.length > 1) { 
      return getDigitalRoot(_dr) 
     } 

     return parseInt(_dr) 
    } 

    const digitalRootSorted = a.sort((a,b) => { 
     const _a = getDigitalRoot(a) 
     const _b = getDigitalRoot(b) 

     return _a < _b 
      ? -1 
      : _a > _b 
       ? 1 
       : a < b 
        ? -1 
        : a === b 
         ? 0 
         : 1 
    }) 

    return digitalRootSorted 
} 
+0

哇,這是一個大'getDigitalRoot'函數,你可以寫:'getDigitalRoot = n =>(n%9)|| 9;' –

+0

您是否收到「隱藏測試失敗」以外的任何消息 - 例如這可能是你的解決方案超過了時間限制嗎? –

+0

@WashingtonGuedes您的建議正確計算了數字根長至9 - 以上所有內容都需要進一步處理。 –

回答

2

你可以只總結了數字和使用方法鏈,像

const sum = n => [...n.toString()].reduce((a, b) => +a + +b), 
 
     array = [13, 20, 7, 4]; 
 

 
array.sort((a, b) => sum(a) - sum(b) || a - b); 
 

 
console.log(array);

+1

const sum = n => [... n] .reduce(( a,b)=> a + b);它會拋出錯誤,因爲你不能在數組中使用...操作符之前的數字 – Gor

+0

@Gor,對,還有另一個錯誤。謝謝。 –

+0

爲什麼'a + b'和'+ a + + b'之間存在差異? –