一、题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分
,所有偶数在数组的后半部分
。
二、示例
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;
}
}