本文转载自【微信公众号:五角钱的程序员,ID:xianglin965】经微信公众号授权转载,如需转载与原文作者联系
21. 调整数组顺序使奇数位于偶数前面
题目描述
需要保证奇数和奇数,偶数和偶数之间的相对位置不变,这和书本不太一样。
解题思路
方法一:
创建一个新数组,时间复杂度 O(N),空间复杂度 O(N)。
package 剑指offer.调整数组顺序使奇数位于偶数前面_21;/*
作者 :XiangLin
文件 :OrderArray.java
IDE :IntelliJ IDEA
*/
import java.util.Arrays;
public class OrderArray {
public int[] reOrderArray(int[] nums){
//奇数个数
int oddCnt = 0;
for(int x: nums){
if (!isEven(x)){
oddCnt++;
}
}
int[] copy = nums.clone();
int i = 0, j = oddCnt;
for (int num : copy){
if (num % 2 == 1)
nums[i++] = num;
else
nums[j++] = num;
}
return nums;
}
private boolean isEven(int x){
return x % 2 == 0;
}
public static void main(String[] args) {
int nums[] = {1,2,3,4,5};
OrderArray o = new OrderArray();
int[] data = o.reOrderArray(nums);
System.out.println(Arrays.toString(data));
}
}
方法二:
使用冒泡思想,每次都将当前偶数上浮到当前最右边。时间复杂度 O(N2),空间复杂度 O(1),时间换空间。
package 剑指offer.调整数组顺序使奇数位于偶数前面_21;/*
作者 :XiangLin
文件 :OrderArray2.java
IDE :IntelliJ IDEA
*/
import java.util.Arrays;
public class OrderArray2 {
public int[] reOrderArray(int[] nums){
int N = nums.length;
for (int i = N - 1; i > 0; i --){
for (int j = 0; j < i; j++){
if (isEven(nums[i]) && !isEven(nums[j + 1])){
swap(nums,j,j+1);
}
}
}
return nums;
}
private boolean isEven(int x){
return x % 2 == 0;
}
private void swap(int[] nums, int i ,int j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
public static void main(String[] args) {
int nums[] = {1,2,3,4,5};
OrderArray2 o = new OrderArray2();
int[] data = o.reOrderArray(nums);
System.out.println(Arrays.toString(data));
}
}