题目链接
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
需要注意题目中有要求保证奇数和奇数,偶数和偶数之间的相对位置不变。
如果没有这个要求,我们可以维护两个指针,分别从数组的两端进行遍历,当左指针遇到偶数停下,当右指针遇到奇数停下,然后将左指针指向的数字和右指针指向的数字交换,直到左右指针相遇。
但是题目要求使我们不能这样做,由于涉及到数字之间的相对位置,因此需要插入排序的思想
定义一个变量oddNum,初始值为0,然后从左到右遍历数组,当遇到奇数,就将其左侧的所有偶数都移到后面,奇数插入到这些偶数的前面,当这个奇数当前位置为i时,由于我们定义了oddNum,因此前面的偶数数量是i - oddNum
继续遍历数组,找到第二个奇数5,将其向前移动i - oddNum个位置
继续上述操作
完整代码
public class Solution {
public void reOrderArray(int [] array) {
int oddNum = 0;
for(int i = 0; i < array.length; i++){
if(array[i] % 2 == 1){
int index = i;
int tmp = array[i];
while(index > oddNum){
array[index] = array[index - 1];
index--;
}
array[oddNum] = tmp;
oddNum++;
}
}
}
}