力扣---剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

发布时间 2023-03-31 19:09:50作者: Owlwu

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

 

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
 

提示:

0 <= nums.length <= 50000
0 <= nums[i] <= 10000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

如果修改原数组的话用双指针,交换数组两边的奇数和偶数。

如果是新建一个nums数组,那么还是双指针,只不过是把遍历到的奇数添加到左指针,遍历到的偶数添加到右指针。

class Solution {
    public int[] exchange(int[] nums) {
        int p1 = 0;
        int p2 = nums.length - 1;
        while (p1 < p2) {
            // 找到从左边开始第一个偶数
            while (p1 < p2 && nums[p1] % 2 != 0) {
                p1 ++;
            }
            // 找到从右边开始第一个偶数
            while (p2 > p1 && nums[p2] % 2 == 0) {
                p2 --;
            }
            // 将找到的偶数和奇数互换(如果p1 == p2,则相当于本身互换,还是不影响,但可以减少一次if判断。)
            int tem = nums[p1];
            nums[p1] = nums[p2];
            nums[p2] = tem;
        }
        // 此处修改了原数组。
        return nums;
    }
}

class Solution {
    public int[] exchange(int[] nums) {
        int p1 = 0;
        int p2 = nums.length - 1;
        int[] res = new int[nums.length];
        for (int x : nums) {
            if (x % 2 == 0) {
                res[p2--] = x;
            } else {
                res[p1++] = x;
            }
        }
        return res;
    }
}