我正在研究 leetcode 问题的解决方案(https://leetcode.com/problems/sender-with-largest-word-count/),当我遇到一个场景时,我花了几个小时尝试调试,但仍然无法解决“不知道发生了什么事。为了简化,给定一个对象:
let items = [
[ 'K', 4 ], [ 'kFIbpoFxn', 10 ], [ 'yErgn', 6 ],
[ 'N', 8 ], [ 'wtJesr', 9 ], [ 'rusffeL', 14 ],
[ 'KlpoodEd', 5 ], [ 'qGcQqIVdFr', 1 ], [ 'ztmCdK', 10 ],
[ 'HFILjKln', 12 ], [ 'TmmQZ', 18 ], [ 'R', 7 ],
[ 'CNh', 7 ], [ 'YMQDBkOWy', 22 ], [ 'kjiSc', 4 ],
[ 'cGMsZxxx', 6 ], [ 'PPqsmNBewN', 21 ], [ 'gbtn', 10 ],
[ 'nQNcL', 8 ], [ 'rK', 10 ], [ 'ppr', 16 ],
[ 'LhSVp', 11 ], [ 'Ub', 7 ], [ 'QGRFMLY', 11 ],
[ 'SdDObYkD', 9 ], [ 'q', 3 ], [ 'suAakSCuHz', 6 ],
[ 'dnzhjdwrEt', 8 ], [ 'ubIEXAO', 22 ], [ 'EsBuLal', 11 ],
[ 'xlQqQRrdTv', 12 ], [ 'mWxCG', 8 ], [ 'DmwIEmS', 5 ],
[ 'nBQLLS', 6 ], [ 'QhF', 4 ], [ 'bmtYQKYv', 5 ],
[ 'PRiNk', 7 ], [ 'QyYJw', 7 ], [ 'QIFauTN', 3 ],
[ 'zJLcUq', 13 ], [ 'TU', 1 ], [ 'lCkGjDY', 7 ],
[ 'A', 6 ]
]
我尝试首先根据最大整数对其进行排序,但如果这些值相等,则按最大字典值排序,即 JS 默认情况下如何对字符串进行排序的 .reverse()
我的排序代码是:
items.sort(function(a, b) {
return b[1] !== a[1] ? b[1] - a[1] : -a[0].localeCompare(b[0]);
});
导致:
[
[ 'YMQDBkOWy', 22 ], [ 'ubIEXAO', 22 ], [ 'PPqsmNBewN', 21 ],
[ 'TmmQZ', 18 ], [ 'ppr', 16 ], [ 'rusffeL', 14 ],
[ 'zJLcUq', 13 ], [ 'xlQqQRrdTv', 12 ], [ 'HFILjKln', 12 ],
[ 'QGRFMLY', 11 ], [ 'LhSVp', 11 ], [ 'EsBuLal', 11 ],
[ 'ztmCdK', 10 ], [ 'rK', 10 ], [ 'kFIbpoFxn', 10 ],
[ 'gbtn', 10 ], [ 'wtJesr', 9 ], [ 'SdDObYkD', 9 ],
[ 'nQNcL', 8 ], [ 'N', 8 ], [ 'mWxCG', 8 ],
[ 'dnzhjdwrEt', 8 ], [ 'Ub', 7 ], [ 'R', 7 ],
[ 'QyYJw', 7 ], [ 'PRiNk', 7 ], [ 'lCkGjDY', 7 ],
[ 'CNh', 7 ], [ 'yErgn', 6 ], [ 'suAakSCuHz', 6 ],
[ 'nBQLLS', 6 ], [ 'cGMsZxxx', 6 ], [ 'A', 6 ],
[ 'KlpoodEd', 5 ], [ 'DmwIEmS', 5 ], [ 'bmtYQKYv', 5 ],
[ 'QhF', 4 ], [ 'kjiSc', 4 ], [ 'K', 4 ],
[ 'QIFauTN', 3 ], [ 'q', 3 ], [ 'TU', 1 ],
[ 'qGcQqIVdFr', 1 ]
]
问题是“ubIEXAO”应该排在“YMQDBkOWy”之前。当您执行隔离的 -a.compareLocale(b) 时,它可以正常工作,并且在其他测试用例中,这部分代码可以正确对其他字符串进行排序。但在这个测试用例中则不然。我缺少什么?谢谢!
(我知道有无数其他方法可以解决这个问题,我只是想知道为什么这个排序函数没有按照该对象的预期工作)
您可以直接使用比较运算符使其区分大小写。
items.sort((a, b) => b[1] - a[1] || (b > a) - (b < a));