CodeWars 的重量对重量

Nad*_*ius 3 javascript sorting lexicographic

问题是:

“我和我的朋友约翰是‘Fat to Fit Club (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(' ')
}
Run Code Online (Sandbox Code Playgroud)

字符串上的代码字即使有两个具有相同值的连续数字,但当添加 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 113 114 52 25 109 83 155 76 59 161330 450231 274111 93131 440830 432353 274292 320986 371567 29858'

被困在这个问题上的时间比我想承认的还要长,哈哈

谢谢

Nin*_*olz 6

您需要一次排序和按字符串排序以获得相同的总和。

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');
Run Code Online (Sandbox Code Playgroud)

  • @mrahma04表达式由 [逻辑 OR `||`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_OR) 分隔,如果两者之间的部分返回零或任何其他虚假值,下一部分将被评估。`a &gt; b || 部分 -(a &lt; b)` 适用于字符串和数字,但如果是字符串,则按字符串排序,如果是数字,则按数字排序。简而言之,如果“a”小于“b”,则返回“true”,如果大于“a”,则返回“true”并返回“-1”。“reduce”从零开始,因此“a”始终是一个数字。 (2认同)