输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
这题进一步抽象就是满足一定条件的元素都移动到数组的前面,不满足的移动到后面。所以,需要有一个参数用来传递判断函数。
最优解法就是数组两头分别有一个指针,然后向中间靠拢。符合条件,就一直向中间移动;不符合条件,就停下来指针,交换两个元素;然后继续移动,直到两个指针相遇。
函数change
运用了设计模式中的“桥接模式”,判断条件由用户自己定义。
/*** 交换数组元素* @param {Array} arr* @param {Number} i* @param {Number} j*/const swap = (arr, i, j) => ([arr[i], arr[j]] = [arr[j], arr[i]]);/*** 将符合compareFn要求的数据排在前半部分,不符合要求的排在后半部分* @param {Array} brr* @param {Function} compareFn* @return {Array}*/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));