题目描述:
输入一个长度为 n 整数数组,数组里面不含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:0 ≤ n ≤5 000,数组中每个数的值 0 ≤ val ≤ 10000
要求:时间复杂度 O(n),空间复杂度 O(n)
进阶:时间复杂度 O(n^2),空间复杂度 O(1)
示例1:
输入:[1,2,3,4]
返回值:[1,3,2,4]
示例2
输入:[2,4,6,5,7]
返回值:[5,7,2,4,6]
示例3
输入:[1,3,5,6,7]
返回值:[1,3,5,7,6]
解法:两次遍历。
思路:
定义一个与原数组大小一致的数组,第一次遍历找到原数组中所有奇数存入结果数组中,第二次遍历找到所有偶数存入结果数组中。
代码如下:
import java.util.*;
public class Solution {
public int[] reOrderArray (int[] array){
//存储结果的数组
int[] result = new int[array.length];
//索引
int index = 0;
//找到所有的奇数,放到result中
for(int i=0; i < array.length; i++){
if(array[i] % 2 != 0){
result[index++] = array[i];
}
}
//找到所有的偶数,放到result中
for(int i=0; i < array.length; i++){
if(array[i] % 2 == 0){
result[index++] = array[i];
}
}
//返回结果
return result;
}
}
在本题中调整数组顺序过程中强调了要保证奇数和奇数、偶数和偶数之间的相对位置不变。如果说没有这个前提条件的话,可以使用双指针遍历的方式。即:通过left和right两个指针,分别指向数组的起始位置和末尾位置,然后向中间位置靠拢,左指针找到第一个偶数时停止,右指针找到第一个奇数时停止,然后进行交换。代码如下:
public static int[] reOrderArray (int[] array){
//左指针指向数组首位置,右指针指向数组末尾位置
int left = 0, right = array.length-1;
//临时变量
int temp;
while(left < right){
//当left小于right,并且array[left]为奇数,向后遍历,直到找到第一个偶数
while(left < right && (array[left] & 1) == 1){
left ++;
}
//当left小于right,并且array[right]为偶数,向前遍历,直到找到第一个奇数
while(left < right && (array[right] & 1) == 0){
right --;
}
//交换位置
temp = array[left];
array[left] = array[right];
array[right] = temp;
}
return array;
}