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;
    }
}
相关推荐
闲看云起2 小时前
LeetCode-day5:三数之和
算法·leetcode·职场和发展
黛色正浓2 小时前
leetCode-热题100-滑动窗口合集(JavaScript)
javascript·算法·leetcode
漫随流水3 小时前
leetcode算法(145.二叉树的后序遍历)
数据结构·算法·leetcode·二叉树
漫随流水3 小时前
leetcode算法(94.二叉树的中序遍历)
数据结构·算法·leetcode·二叉树
菜鸟233号5 小时前
力扣343 整数拆分 java实现
java·数据结构·算法·leetcode
茶猫_6 小时前
C++学习记录-旧题新做-链表求和
数据结构·c++·学习·算法·leetcode·链表
源代码•宸6 小时前
Leetcode—1161. 最大层内元素和【中等】
经验分享·算法·leetcode·golang
努力学算法的蒟蒻7 小时前
day55(1.6)——leetcode面试经典150
算法·leetcode·面试
老鼠只爱大米8 小时前
LeetCode算法题详解 1:两数之和
算法·leetcode·面试题·两数之和·two sum
2501_941822758 小时前
从限流降载到全链路流控的互联网工程语法实践与多语言探索
leetcode·模拟退火算法