题目要求
调整数组顺序!使得奇数位于偶数之前。调整之后,不关心大小顺序。
如数组:[1,2,3,4,5,6]
调整后可能是:[1, 5, 3, 4, 2, 6]或者为[1, 3, 5, 6, 4, 2]
第一种方法:交换两个元素
原理图
实现代码
import java.util.Arrays;
public class Main {
public static void reorder(int[] array){
int i = 0;
int j = array.length-1;
while (i <j) {
while (i < j && array[i] % 2 != 0) {
i++;//如果i下标遇到的对应元素为奇数,i则往后走
}
while (i < j && array[j] % 2 == 0) {
j--;//如果j下标遇到的对应元素为偶数,j则往前走
}
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
reorder(array);
System.out.println(Arrays.toString(array));
}
}
输出结果
[1, 5, 4, 3, 2, 6]
注意事项
两个while循环的判断条件不能单纯的写array[i]%2!=0(array[j]%2==0),要考虑到极端情况,就是当数组都是奇数(偶数)时。如果没有i<j这个条件 i(j)会一直增加(偶数)直至越界
当数组int[] array = {1,3,5,7,9}时
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5(数组越界)
at Main.reorder(Main.java:10)!
at Main.main(Main.java:25)
当数组int[] array = {2,4,6,8}时
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1(数组越界)
at Main.reorder(Main.java:13)
at Main.main(Main.java:25)
第二种写法:定义一个跟目标数组一样长度的临时数组,给临时数组赋值,最后临时数组再赋值给目标数组
原理图
实现代码
import java.util.Arrays;
public class Main {
public static int[] reorder(int[] array){
int left = 0;
int right = array.length-1;
int[] tmp = new int[array.length];
// 增强版for循环:foreach 普通for循环
for (int j : array) { // for (int i = 0; i < array.length; i++) {
if (j % 2 != 0) { // if(array[i]%2!=0){
tmp[left] = j; // tmp[left] = array[i];
left++; // left++;
} else { // } else {
tmp[right] = j; // tmp[right] = array[i];
right--; // right--;
} // }
} // }
array = tmp;
return array;
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.toString(reorder(array)));
}
}
输出结果
[1, 3, 5, 6, 4, 2]
注意事项
这种方法写有个缺点,就是当数组中的元素都是偶数时,数组会逆置输出,而全是奇数时不会
当数组int[] array = {1,3,5,7,9}时
[1, 3, 5, 7, 9]
当数组int[] array = {2,4,6,8}时
[8, 6, 4, 2]
觉得写的不错的话点个赞呗😊