我有一个数字数组,只需要按左右屏障对其中的一部分进行排序。你能帮助我如何正确地实施它吗?
const sortBetween = (arr, left, right) => {
...
}
given: [9,3,5,7,4,9,4,1] , left = 2, right = 5
expected: [9,3,4,5,7,9,4,1]
[9,3,5,7,4,9,4,1]->[9,3,4,5,7,9,4,1]
谢谢你的帮助。
这是一种直接使用sort
的方法,但使用Proxy
对length
和索引进行访问。
type original array length
------- ------------------------ ------
values 9 3 5 7 4 9 4 1 8
indices 0 1 2 3 4 5 6 7
------- ------------------------ ------
type proxy view length
------- ------------------------ ------
values 5 7 4 9 4
indices 0 1 2 3
------- ------------------------ ------
const
sortBetween = (array, left, right) => {
new Proxy(array, {
get (target, prop) {
if (isFinite(prop)) return target[+prop + left];
if (prop === 'length') return right - left + 1;
return target[prop];
},
set (target, prop, receiver) {
target[+prop + left] = receiver;
return true;
}
})
.sort((a, b) => a - b);
return array;
};
console.log(...sortBetween([9, 3, 5, 7, 0, 9, 4, 1], 2, 5)); // [9, 3, 0, 5, 7, 9, 4, 1]
您可以使用Divide and Conque方法来完成此操作。你可以试试这个-
const sortBetween = (arr, left, right) => {
let leftArr = [],
rightArr = [],
sortedArr = [];
/**
* Divide the array into 3 parts. Left, Mid, Right.
* You have to sort the mid one.
*/
if (left > 0) {
leftArr = arr.slice(0, left);
}
if (right < arr.length) {
rightArr = arr.slice(right);
}
sortedArr = arr.slice(left, right).sort();
// Finally merge the 3 parts and returns
return [...leftArr, ...sortedArr, ...rightArr];
}
const arr = [9,3,5,7,4,9,4,1];
const res = sortBetween(arr, 2, 5);
const res1 = sortBetween(arr, 0, 5);
const res2 = sortBetween(arr, 0, 8);
console.log(res, res1, res2);
.as-console-wrapper {min-height: 100%!important; top: 0}
最终(我希望(:
newArr = [].concat(
arr.slice(0,left),
arr.slice(left,right+1).sort(),
arr.slice(right+1,arr.length)
)
包含right
,
假设左不大于右,
>假设数组不为空,
等等。
上一次编辑:
我已经阅读了评论
基本正确
我监督的问题是,请求的排序介于左和右之间包含,而slice
的第一个参数是包括并且第二个参数是排除。
现在,我看到了,最后一部分应该是负值,左边和数组长度之间的差
但是,我不会试图解决这个问题。。。
我的原创作品";回答":
我建议您使用slice
将数组拆分为3个子数组,对中间部分进行排序,然后使用concat
将它们重新组合在一起,例如:
newArr=[].concat(arr.slice(0,left),arr.slice(left,right+1).sort(),arr.slice(left+right-1))
我可以建议你通过网络搜索来更熟悉slice
和concat
吗?