366 字
2 分钟
奇偶排序数组

毕业那会面试遇到的算法题,有双指针的思想就不难实现 O(n) 的时间复杂度,后来发现是 LeetCode 上的原题 905. 按奇偶排序数组

题目

给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。

示例

输入:nums = [3,1,2,4]
输出:[2,4,3,1]
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。

思路

用两个指针分别指向数组头尾,判断两个指针元素是否符合一奇一偶

  • 是,交换元素并且指针往中间移动
  • 不是,判断指针是否需要往中间移动
public int[] sortArrayByParity(int[] nums) {
// 用两个指针分别指向数组头和尾
int start = 0;
int end = nums.length - 1;
// 指针相遇停止循环
while (start < end) {
// 判断指针指向的数组元素是否符合一奇一偶,符合就交换元素并且指针同时往中间移动
if (nums[start] % 2 != 0 && nums[end] % 2 == 0) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
continue;
}
// 如果 start 指针是偶数,不需要交换,往中间移动找下一个元素
if (nums[start] % 2 == 0) start++;
// 如果 end 指针是奇数,不需要交换,往中间移动找下一个元素
if (nums[end] % 2 != 0 ) end--;
}
return nums;
}
奇偶排序数组
https://cloop.zone.id/posts/algorithm/sort-array-by-parity/
作者
Cloop
发布于
2025-03-26
许可协议
CC BY-NC-SA 4.0