问题描述:
给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数;并且都要分别有序。
第一行输入整数n。(1<=n<=1000)表示数组大小 第二行输入n个整数a.(1<=n<=100)
例子
示例 1:
输入:
6
3 34 67 89 90 58
输出:3 67 89 34 90 58
提示:
无
代码实现:
1.双指针:
public static ArrayList<Integer> solution(int n, ArrayList<Integer> arr){
ArrayList<Integer> result = new ArrayList<>();
ArrayList<Integer> result2 = new ArrayList<>();
int left=0;
int right=0;
int L=0;
int R=n-1;
while (L <= R) {// 双指针查找,左指针位偶就去 右指针找奇数,然后交换位置,最后左右指针相遇结束,就得到了左边位奇数,右边为偶数的数组,但是不是有序的的。
if (arr.get(L) % 2 == 0) {
left = arr.get(L);
while (true) {
if (L > R) {
break;
}
if (arr.get(R) % 2 != 0) {
right = arr.get(R);
arr.set(L++, right);
arr.set(R--, left);
break;
} else {
R--;
}
}
} else {
L++;
}
}
//有序处理
for(Integer item:arr){
if(item%2==0){
break;
}
result.add(item);
}
for(int i=n-1;;i--){
if(arr.get(i)%2!=0){
break;
}
result2.add(arr.get(i));
}
arr.clear();
Collections.sort(result);
Collections.sort(result2);
arr.addAll(result);
arr.addAll(result2);
return arr;
}
运行结果:
题目来源:CSDN
链接: CSDN题目