首先,您需要对数组进行排序。你可以随心所欲地这样做,但在这个例子中,我将使用快速排序。时间复杂度为 O (n * log n)。
请记住,我在这里或多或少地从头开始做所有事情(不使用内置方法),因此您可以看到它是如何完成的。在学习只使用为你完成所有工作的函数时,我真的觉得它没有帮助,因为那样你就看不到发生了什么。
从一个未排序的数组开始:
let unsortedArray = [403, 101, 203, 102, 302, 103, 201, 202, 301, 303, 401, 402];
这是我们的递归快速排序函数:
let quicksort = arr => {
if (arr.length < 2) {
return arr;
}
let pivotIndex = rand(0, arr.length),
pivot = arr[pivotIndex],
less = [],
more = [],
sorted = [];
for (let i = 0, len = arr.length; i < len; i++) {
if (pivotIndex !== i) {
if (arr[i] > pivot) {
more.push(arr[i]);
} else {
less.push(arr[i]);
}
}
}
return sorted.concat(quicksort(less)).concat([pivot]).concat(quicksort(more));
};
let rand = (min, max) => {
return Math.floor( Math.random() * (min - max) + max );
};
在未排序的数组上调用函数:
let sortedArray = quicksort(unsortedArray);
现在我们得到:
[101, 102, 103, 201, 202, 203, 301, 302, 303, 401, 402, 403]
太好了,现在数组已排序。
让我们把这个数组分成几组,让它看起来像这样:
[ [101, 102, 103], [201, 202, 203], [301, 302, 303], [401, 402, 403] ]
使用一点 Redu 的解决方案,这是我们的分区函数:
let partition = arr => {
return arr.reduce((prev, curr) => {
let remainder = curr % 100;
if (prev[remainder - 1]) {
prev[remainder - 1] = prev[remainder - 1].concat(curr);
} else {
prev[remainder - 1] = [curr];
}
return prev;
}, []);
};
现在在排序后的数组上调用分区:
let partitionedArray = partition(sortedArray);
...瞧!我们得到[ [101, 102, 103], [201, 202, 203], [301, 302, 303], [401, 402, 403] ]。