题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路一
比较憨批的写法
import java.util.ArrayList;
public class Solution {
public void reOrderArray(int [] array) {
ArrayList<Integer> ar = new ArrayList<>();
for(int i =0;i<array.length;i++){
if((array[i]&1 )==1){
ar.add(array[i]);
}
}
for(int i =0;i<array.length;i++){
if((array[i]&1 )!=1){
ar.add(array[i]);
}
}
for (int i = 0; i < ar.size(); i++) {
array[i] =ar.get(i);
}
}
}
即 使用了辅助的数组集合
时间复杂度:O(n)
空间复杂度:O(n)
in-place算法
如果不开辟额外数组该怎么做呢?
初始化操作:记录一个变量i表示已经将奇数放好的下一个位置,显然最开始i=0,表示还没有一个奇数放好。
j 表示数组的下标,初始值为0, 表示从下标0开始遍历。
- 如果遇到偶数,j++
- 如果遇到奇数,假设位置为j,就将此奇数插入到i所指的位置,然后i往后移动一个位置,在插入之前,显然会涉及到数据的移动,也就是将[i,j-1]整体往后移动。
- 直到整个数组遍历完毕,结束

import java.util.ArrayList;
public class Solution {
public void reOrderArray(int [] array) {
int i = 0;
for (int j=0; j<array.length; ++j) {
if ((array[j]&1)==1) {
int tmp = array[j];
for (int k=j-1; k>=i; --k) {
array[k+1] = array[k];
}
array[i++] = tmp;
}
}
}
}
本文介绍了一种不改变奇数和偶数内部顺序的前提下,将数组中的所有奇数置于偶数前面的方法。通过两种不同的算法实现:一种使用辅助数组,简单但空间复杂度较高;另一种采用in-place算法,虽然实现较为复杂但不占用额外空间。
1058

被折叠的 条评论
为什么被折叠?



