重量来自CodeWars

问题描述

问题是:

“我的朋友约翰和我是“胖子健身俱乐部(FFC)”的成员。 很担心,因为每个月都有一份成员权重的清单 发表,每个月他都是列表中的最后一个,这意味着他是 最重的。

我是确定名单的人,所以我告诉他:“不用担心 更多,我将修改列表的顺序。” 将“权重”赋予数字。一个数字的权重将来自 现在是数字的总和。

例如99的“权重”为18,100的“权重”为1,所以在 列表100将排在99之前。给定一个权重为 FFC成员可以按正常顺序输入以下字符串: 这些数字的“权重”?”

示例

按数字重量排序的“ 56 65 74 100 99 68 86 180 90”变为:“ 100 180 90 56 65 74 68 86 99” 当两个数字具有相同的“权重”时,让我们将它们视为 是字符串(按字母顺序排序)而不是数字:100之前 180,因为其“重量”(1)小于180(9)和180中的一个 在90之前,因为它具有相同的“权重”(9),因此在 字符串。

列表中的所有数字均为正数,列表可以为 空的。

这是我到目前为止的代码

function sumOfParts(num) {
  return num.split('').reduce((a,b) => parseInt(a) + parseInt(b),0)
} 

function orderWeight(string) {
  return string.split(' ').sort().sort((a,b) => sumOfParts(a) - sumOfParts(b)).join(' ')
}

即使两个连续的数字具有相同的值,但字符串上的代码字却相加,但是当3+个具有相同总和的数字相加时,它开始中断...。 以下是一些破坏它的字符串:

预期:'112 14 170 233100 63 29 65 138 156 67 77 79 324612 144435 143275 335392 477504 460549 96194 281479 347984',取而代之:'112 14 170 63 233100 29 65 156 138 67 77 79 324612 144435 143275 335392 477504 460549 96194 281479 347984'

预期:'200 113 41 114 25 52 109 155 83 76 161330 59 450231 274111 93131 440830 432353 274292 320986 371567 29858',而是得到:'200 41 113114 52 25 109 83 155 76 59 161330 450231 274111 93131 440830 432353 274292 320986 371567 29858'

在此之前停留更长的时间,然后我想大声笑

谢谢

解决方法

对于相同的总和,您需要一个排序和一个字符串排序。

function sumOfParts(num) {
    return num.split('').reduce((a,b) => a + +b,0)
} 

function orderWeight(string) {
    return string
        .split(' ')
        .sort((a,b) => sumOfParts(a) - sumOfParts(b) || a > b || -(a < b))
        .join(' ');
}

console.log('out',orderWeight('112 14 170 63 233100 29 65 156 138 67 77 79 324612 144435 143275 335392 477504 460549 96194 281479 347984'));
console.log('exp','112 14 170 233100 63 29 65 138 156 67 77 79 324612 144435 143275 335392 477504 460549 96194 281479 347984');


console.log('out',orderWeight('200 41 113 114 52 25 109 83 155 76 59 161330 450231 274111 93131 440830 432353 274292 320986 371567 29858'));
console.log('exp','200 113 41 114 25 52 109 155 83 76 161330 59 450231 274111 93131 440830 432353 274292 320986 371567 29858');