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;
    }
}
相关推荐
雪碧聊技术3 小时前
力扣 回溯法 | LCR 020. 回文子串
javascript·算法·leetcode
wabs6663 小时前
关于哈希表【力扣454.四数相加II的思考】
数据结构·算法·leetcode·散列表
Forever Nore3 小时前
LeetCode 2 两数相加 - 链表
leetcode·链表·哈希表
rannn_1114 小时前
【力扣hot100】238、41、73题解
java·算法·leetcode·开发
evans在进步6 小时前
LeetCode 236:二叉树的最近公共祖先——DFS 路径记录法详解
算法·leetcode·深度优先
evans在进步19 小时前
LeetCode 2 两数相加:链表模拟加法,Java 图解进位过程
java·leetcode·链表
Hi李耶19 小时前
【LeetCode】557.反转字符串中的单词 III
算法·leetcode·职场和发展
wangwangmoon_light1 天前
1.1 灵神题单总结_滑动窗口与双指针
leetcode
Navigator_Z1 天前
LeetCode //C - 1187. Make Array Strictly Increasing
c语言·算法·leetcode
旖旎夜光1 天前
LeetCode 397:整数替换(贪心问题) —— 题解
数据结构·c++·算法·leetcode·贪心算法