PHP算法练习九:将全部偶数转到全部奇数之前

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. 总结

本题的解法相对来说比较简单,考察的是基本的数组操作和指针操作。如果想要提高代码的效率,更好地解决问题,我们需要多思考,多进行平时的算法练习,扎实基础。

后端开发标签