LeetCode 905. Sort Array By Parity

Given an integer array nums, move all the even integers at the beginning of the array followed by all the odd integers.

Return any array that satisfies this condition.

Example 1:

复制代码
Input: nums = [3,1,2,4]
Output: [2,4,3,1]
Explanation: The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted.

Example 2:

复制代码
Input: nums = [0]
Output: [0]

Constraints:

  • 1 <= nums.length <= 5000
  • 0 <= nums[i] <= 5000

把一个数组里偶数放在前面,奇数放在后面。

自己的想法就是用two pointers分别指向前后,前面的如果遇到奇数就记下来,后面的如果遇到偶数就记下来,前后都有了以后就互相交换就完事了。于是就写了如下的代码,debug了巨久,各种corner case......感觉非常不优雅。

复制代码
class Solution {
    public int[] sortArrayByParity(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        while (start < end) {
            while (start < nums.length && nums[start] % 2 == 0) {
                start++;
            }
            // now nums[start] is odd
            while (end >= 0 && nums[end] % 2 != 0) {
                end--;
            }
            // now nums[end] is even
            // swap nums[start] and nums[end]
            if (start < end) {
                int temp = nums[start];
                nums[start] = nums[end];
                nums[end] = temp;
                start++;
                end--;
            }
        }
        return nums;
    }
}

于是去solutions溜达了一圈,大家的想法都大差不差,但是很明显大家都不像我这么贪心,在while里还加while来想一次找到需要交换的start和end,而可以一步步来,这样会更清晰,也不用这么多corner case的条件。

复制代码
class Solution {
    public int[] sortArrayByParity(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        while (start < end) {
            if (nums[start] % 2 == 0) {
                start++;
            } else {
                if (nums[end] % 2 == 0) {
                    int temp = nums[start];
                    nums[start] = nums[end];
                    nums[end] = temp;
                    start++;
                } 
                end--;
            }
        }
        return nums;
    }
}

后面又写到一道题的时候看了下也有人用我最开始写的while的方法,于是refine了一下,让它变得更优雅了,那我更喜欢这种做法了:

复制代码
class Solution {
    public int[] sortArrayByParity(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        while (start < end) {
            while (start < end && nums[start] % 2 == 0) {
                start++;
            }
            while (start < end && nums[end] % 2 != 0) {
                end--;
            }
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
        }
        return nums;
    }
}
相关推荐
8Qi819 分钟前
LeetCode 72:编辑距离(Edit Distance)—— 题解
算法·leetcode·职场和发展·动态规划
8Qi827 分钟前
LeetCode 583. 两个字符串的删除操作
算法·leetcode·职场和发展·动态规划
小欣加油3 小时前
Leetcode31 下一个排列
数据结构·c++·算法·leetcode·职场和发展
_日拱一卒3 小时前
LeetCode:39组合总和
java·算法·leetcode·职场和发展
郝学胜-神的一滴3 小时前
力扣 662 :二叉树最大宽度
java·数据结构·c++·python·算法·leetcode·职场和发展
小欣加油3 小时前
leetcode169 多数元素
数据结构·c++·算法·leetcode·职场和发展
如竟没有火炬4 小时前
恢复二叉搜索树
数据结构·数据库·python·leetcode·动态规划
如竟没有火炬4 小时前
整数拆分——动态规划
开发语言·数据结构·python·算法·leetcode·动态规划
sheeta199818 小时前
LeetCode 每日一题笔记 日期:2026.06.06 题目:2196. 根据描述创建二叉树
笔记·算法·leetcode
小欣加油18 小时前
leetcode994 腐烂的橘子
数据结构·c++·算法·leetcode·bfs