2017-06-18 50 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'之间存在差异? –