调整数组顺序使奇数位于偶数前面|刷题打卡

197 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述

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

示例:

输入

nums = [1,2,3,4]

输出

[1,3,2,4]

注:[3,1,2,4] 也是正确的答案之一。

提示

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

二、思路分析

我的思路

从前往后找偶数,找到偶数再从后往前找奇数,找到2个数做个交换

最佳思路

这题目可以2种解法:

  • 上面我想到的那种应该叫做:首尾双指针
  • 还有快慢指针法:
  • 2个指针从头开始遍历,1个遇到了奇数停下来,1个遇到偶数停下来,然后2个做个交换
    • 其实和收尾双指针一样的,慢的指针从头开始找偶数,块的指针不断往后面去找到奇数,然后做交换,也就是我是从后往前取奇数,而他是从前往后取奇数。

三、AC 代码

最佳写法:

public int[] exchange(int[] nums) {
    int i = 0;
    int j = nums.length - 1;
    for (; i < nums.length; i++) {
        if (i >= j) {
            break;
        }
        //get新的点:判断奇偶数 使用&1 == 1 表示是奇数 ==0 表示是偶数
        if ((nums[i] & 1) == 0) {
            for (; j > i; j--) {
                if ((nums[j] & 1) == 1) {
                    int tmp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = tmp;
                    break;
                }
            }
        }
    }
    return nums;
}

四、总结

力扣上标记为中等的简单题 😄