首页 > 解决方案 > CodeWars 中的权重

问题描述

问题是:

“我的朋友 John 和我是“Fat to Fit Club (FFC)”的成员。John 很担心,因为每个月都会发布一份包含会员体重的名单,而且每个月他都是名单上的最后一个,这意味着他是最重的。

我是建立名单的人,所以我告诉他:“别担心,我会修改名单的顺序”。决定将“权重”归因于数字。从现在开始,一个数字的权重将是其数字的总和。

例如,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+ 个具有相同总和的数字时,它开始中断....以下是一些破坏它的字符串:

Expected: '112 14 170 233100 63 29 65 138 156 67 77 79 324612 144435 143275 335392 477504 460549 96194 281479 347984', instead got: '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 274111 93131 440830 440830 432353 274292 320986 371567 29858'相反: 29858'

被困在这个上的时间更长了,然后我想承认大声笑

谢谢

标签: javascriptsortinglexicographic

解决方案


对于相同的总和,您需要单次排序和按字符串排序。

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');


推荐阅读