一、题目描述
分割一个整数数组,使得奇数在前偶数在后。
要求:在原数组中完成,不使用额外空间
二、解题思路
思路一:时间复杂度为O(n^2)的解法:从头扫描数组,每碰到一个偶数,就拿出这个数字,并把位于这个数字之后的所有数字都往前挪动一位,挪完之后在数组的末尾有一个空位,把这个偶数放到这个空位。
思路二: 用两个指针pStart和pEnd从数组的首部和尾部往中间扫描,如果发现有偶数出现在奇数前面的情况,就交换他们的位置,直到扫描完整个数组。
三、代码实现
第一种
public class Solution {
/**
* @param nums: an array of integers
* @return: nothing
*/
/**
解法一:从头扫描数组,每碰到一个偶数,就拿出这个数字,并把位于这个数字之后的所有数字
都往前挪动一位,挪完之后在数组的末尾有一个空位,把这个偶数放到这个空位。
时间复杂度O(n^2)
*/
int store = 0; //用于暂时保存碰到的偶数
int flag = 0; //控制循环次数
public void partitionArray(int[] nums) {
// write your code here;
int len = nums.length; //数组大小
flag = len;
while (flag != 0) {
for (int i = 0; i < len - 1; i++) {
if (nums[i] % 2 == 0) { //偶数
store = nums[i]; //暂时保存碰到的偶数
//位于这个数字之后的所有数字都往前挪动一位
for (int j = i + 1; j <= len - 1; j++) {
nums[j-1] = nums[j];
}
nums[len - 1]= store; //将该偶数放到数组最后
len--;
}
}
flag--;
}
}
}
第二种
public void partitionArray(int[] nums) {
int pStart = 0; //初始化指针pStart,让它指向数组第一个元素
int pEnd = nums.length - 1; //初始化指针pEnd,让它指向数组最后一个元素
while (pStart < pEnd) {
//后移pStart,直到它指向偶数
while (pStart < pEnd && (nums[pStart] & 1) != 0) {
pStart++;
}
//后移pEnd,直到它指向奇数
while (pStart < pEnd && (nums[pEnd] & 1) ==0) {
pEnd--;
}
if (pStart < pEnd) { //交换值
int temp = nums[pStart];
nums[pStart] = nums[pEnd];
nums[pEnd] = temp;
}
}
}