1. 题目简述
给定一个数列,将其中的全部偶数转移到全部奇数之前,使得所有的奇数在偶数的前面。
2. 解题思路
2.1. 双指针法
使用两个指针 $i$ 和 $j$,$i$ 从数组的第一个元素开始遍历,$j$ 从数组的最后一个元素开始遍历,如果 $i$ 指向的数是偶数,$j$ 指向的数是奇数,那么就交换两个数的位置,继续移动 $i$ 和 $j$,直到 $i$ 遍历到数组末尾,或者遍历完整个数组。
时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。
2.2. 过滤法
首先遍历一遍数组,将所有的奇数都遍历一遍,然后再遍历一遍数组,将所有的偶数都遍历一遍,依次将偶数插入到所有奇数之前的位置。
时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。
3. 代码实现
3.1. 双指针法
function adjustArray(&$arr, $len)
{
$i = 0;
$j = $len - 1;
while ($i < $j) {
while ($i < $j && $arr[$i] % 2 != 0) {
$i++;
}
while ($i < $j && $arr[$j] % 2 == 0) {
$j--;
}
if ($i < $j) {
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
$i++;
$j--;
}
}
}
3.2. 过滤法
function adjustArray(&$arr, $len)
{
$odd = $even = [];
for ($i = 0; $i < $len; $i++) {
if ($arr[$i] % 2 == 0) {
$even[] = $arr[$i];
} else {
$odd[] = $arr[$i];
}
}
$arr = array_merge($odd, $even);
}
4. 总结
本题的解法相对来说比较简单,考察的是基本的数组操作和指针操作。如果想要提高代码的效率,更好地解决问题,我们需要多思考,多进行平时的算法练习,扎实基础。