1. 题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
2. 思路描述
这题进一步抽象就是满足一定条件的元素都移动到数组的前面,不满足的移动到后面。所以,需要有一个参数用来传递判断函数。
最优解法就是数组两头分别有一个指针,然后向中间靠拢。符合条件,就一直向中间移动;不符合条件,就停下来指针,交换两个元素;然后继续移动,直到两个指针相遇。
3. 代码实现
函数change
运用了设计模式中的“桥接模式”,判断条件由用户自己定义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
const swap = (arr, i, j) => ([arr[i], arr[j]] = [arr[j], arr[i]])
function change(brr, compareFn) { const arr = [...brr], length = brr.length let i = 0, j = arr.length - 1 while (i < j) { while (i < length && compareFn(arr[i])) ++i while (j >= 0 && !compareFn(arr[j])) --j
if (i < j) { swap(arr, i, j) ++i --j } } return arr }
const isOdd = (num) => (num & 1) === 1 console.log(change([1, 2, 3, 4], isOdd))
|