首先,您需要对数组进行排序。您可以以任何方式执行此操作,但是为了这个示例,我将使用快速排序。时间复杂度将为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] ]
。