Nowcoder java-调整数组顺序使奇数位于偶数前面
(题目来自牛客网)
思路
方法一:第一种思路就是,遍历数组,如果是偶数则开始遍历该偶数之后的数字直到找到一个奇数,然后将该偶数 i 和 奇数 j 之间的偶数后移,将 j 位上的奇数放到 i 位置
时间复杂度:O(n^2)
空间复杂度:O(1)借鉴牛客官方详细的题解:
方法二:第二种思路,新建两个数组,一个用来存放奇数,一个用来存放偶数,最后整合,将偶数数组添加到奇数数组之后。
时间复杂度:O(n)
空间复杂度:O(n)
相对位置不变,是考察稳定性。如果不考察稳定性,则用双指针,开头一个指针(i),结尾一个指针(j),开头指的是偶数,结尾指的是奇数,那么交换位置,然后 i++,j–,但是不能保证相对位置不变。
代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ReOrderArray {// 为了便于测试,返回值修改为int[]
public int[] reOrderArray(int[] array) {
//第一种思路就是,遍历数组,如果是偶数则开始遍历该偶数之后的数字直到找到一个奇数,然后将该偶数 i 和 奇数 j 之间的偶数后移,将 j 位上的奇数放到 i 位置
// for (int i = 0; i < array.length; i++) {
// if (array[i] % 2 == 0) {//如果该数据为偶数,则开始查找此数之后的奇数
// int j = i;
// while (j < array.length && array[j] % 2 == 0) {//查询奇数
// j++;
// }
// if (j < array.length) {//找到奇数后将 i 到 j 的偶数后移,j 位上的奇数放到 i 位置处
// int date = array[j];
// for (int k = j; k > i; k--) {//后移操作
// array[k] = array[k - 1];
// }
// array[i] = date;
// } else {
// {//剩下的全为偶数
// break;
// }
// }
// }
// }
// return array;
//第二种思路,新建两个数组,一个用来存放奇数,一个用来存放偶数,最后整合,将偶数数组添加到奇数数组之后。
List<Integer> odd = new ArrayList<>();
List<Integer> even = new ArrayList<>();
for (int i = 0; i < array.length ; i++) {
if (array[i] %2 == 0){
even.add(array[i]);
}else{
odd.add(array[i]);
}
}
odd.addAll(even);
for (int i = 0; i < array.length ; i++) {//将原数组的数挨个替换为odd顺序的值
array[i]= odd.get(i);
}
return array;
}
public static void main(String[] args) {
int[] array = {10, 2, 3, 4, 5, 6, 7, 8};
System.out.println(Arrays.toString(new ReOrderArray().reOrderArray(array)));
}
}