数组-数组奇偶排序

        每日一题,提升自己。今天分享一道关于数组奇偶排序的题目,且听我细细道来。

数组 - 奇偶排序

1. 题目描述

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

示例:

输入:nums =[1,2,3,4]

输出:[1,3,2,4]

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

提示:

1 <= nums.length <= 50000

1 <= nums[i] <= 10000

2. 解题思路

        这道题只是对数组内元素的一个奇偶排序,首先可以想到的就是双指针,从前后来分别扫描元素。首先指定前指针 left 和后指针 right,然后前指针定位偶数,后指针定位奇数,定位到之后将两个值互换,直到数组遍历完成。

复杂度:

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

3. 算法流程

  1. 初始化前指针 left = 0,后指针 right = nums.length - 1。
  2. 当 left < right 时表示该数组还未遍历完成,则继续进行奇数和偶数的交换。
  3. 当 nums[left] 为奇数时,则 left++,直到找到不为奇数的下标为止。
  4. 当 nums[right] 为偶数时,则 right–,直到找到不为偶数的下标为止。
  5. 交换 nums[left] 和 nums[right],继续下一轮交换。
  6. 数组遍历完成之后,返回 nums,即为交换后的结果

4. 代码实现

Java代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static int[] exchange(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right){
// 前指针一直寻找偶数
while (left<right && (nums[left]%2!=0)){
left++;
}
// 后指针一直寻找奇数
while (left<right && (nums[right]%2==0)){
right--;
}
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
return nums;
}