这是一个有点棘手的情况,但我有一个这样的数组:
const nums = [32, -3, 62, 8, 121, -231, 62, 13];
并且需要将它们替换为相应的升序索引。上面的示例应生成:
[4, 1, 5, 2, 7, 0, 6, 3]
我想出的解决办法是:TSPlayground
const nums = [32, -3, 62, 8, 121, -231, 62, 13];
const numsCopy = nums.map(e => e);
// Basic sorting
for (let i = 0; i < numsCopy.length; i++) {
for (let j = 0; j < numsCopy.length; j++) {
if (numsCopy[i] < numsCopy[j]) {
let t = numsCopy[j];
numsCopy[j] = numsCopy[i];
numsCopy[i] = t;
}
}
}
for (let i = 0; i < numsCopy.length; i++) {
let sortedValue = numsCopy[i];
nums[nums.indexOf(sortedValue)] = i;
}
然而,当我修改nums
以包含一个值nums.length > n >= 0
时,问题出现了,调用nums.indexOf(...)
可能返回一个错误的结果,因为它可能已经排序了一个索引,即使它存在于数组的某个地方。
如果用这些值替换nums
,则由于某种原因,-231
的索引将为2
...
const nums = [32, -3, 62, 7, 121, -231, 62, 13, 0];
> [5, 1, 6, 3, 8, 2, 7, 4, 0]
是否有更好的方法来解决这个问题,或者对我的解决方案进行修复?
2条答案
按热度按时间tvz2xvvm1#
您可以按值对索引进行排序,并创建一个新数组,其中的索引值位于已排序的位置。
为了得到想要的结果,再次调用排序函数,你得到按索引顺序排序的索引。
b4lqfgs42#
复制数组,对其值排序,获取
indexOf
,null
为排序副本中的值: