图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

2023-07-13 23:01:38 浏览数 (2)

一、题目

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

二、示例

2.1> 示例:

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

提示:

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

三、解题思路

根据题目描述,我们需要将原整数数组中所有的奇数放到数组的前半部分,所有的偶数放到数组的后半部分,那么本题就是一道比较标准的双指针算法问题。此时我们就需要创建前指针head和后指针tail,head指针会一直向后遍历,直到遍历到偶数(即:与2取余等于0);然后再将tail指针一直向前移动,直到遍历到奇数(即:与2取余不等于0);确定好了head和tail之后,执行互换操作,即:

int temp = nums[head]; nums[head] = nums[tail]; nums[tail] = temp;

那么,由于head指针与tail指针是以相对方向移动的,那么肯定会有“碰头”的那一刻,那么当碰头了之后,就说明整个数组nums已经完全遍历完毕,也就是说,所有的奇数和偶数都已经完成了互换的操作。

关于碰头的判断,我们可以通过如果head小于tail,则说明还未碰头;如果head大于或等于tail,则说明已经碰头了,结束双指针的遍历操作。上面的解题思路大致就是这些,那么还是按照惯例,下图中我们以数组nums=[1, 2, 3, 4]为例,来看一下具体的操作过程:

四、代码实现

代码语言:javascript复制
class Solution {
    public int[] exchange(int[] nums) {
        int head = 0, tail = nums.length - 1;
        while(head < tail) {
            while (nums[head] % 2 != 0 && head < tail) head  ;
            while (nums[tail] % 2 == 0 && tail > head) tail--;
            int temp = nums[head];
            nums[head] = nums[tail];
            nums[tail] = temp;        
        }
        return nums;
    }
}

0 人点赞