笔试遇到了个有意思的题目, 使用的是 双指针 的思想, 受到快排思想启发的, 如果您有更好的思路欢迎留言讨论
时间复杂度 : \(O(n)\) , 空间复杂度 : \(O(1)\)
import java.util.Arrays;
/*
* 有一个splitArr方法, 传入的参数是一个整型的数组, 得到的结果为将该数组进行左右区分开, 奇数存放到左端, 偶数存放到右端
* 请使用最佳的时间复杂度与空间复杂度实现该功能
* */
public class Test {
public static void main(String[] args) {
int[] arr = {-2,-1,0,9,0,4,1,2,3,4,5,6,7,8,9,10};
System.out.println(Arrays.toString(arr));// [-2, -1, 0, 9, 0, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
splitArr(arr);
System.out.println(Arrays.toString(arr)); // [9, -1, 7, 9, 5, 3, 1, 2, 4, 4, 0, 6, 0, 8, -2, 10]
}
public static void splitArr(int[] arr){
int i = 0;
int j = arr.length - 1;
int temp = arr[0];
boolean flag = false;
while (i <= j){
if (arr[i] % 2 == 0){
temp = arr[i];
flag = true;
}else {
i++;
continue;
}
while (flag && i<=j){
if (arr[j] % 2 != 0){
arr[i] = arr[j];
arr[j] = temp;
flag = false;
break;
}
j--;
}
}
}
}