题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
lc
实现
方法2 双指针 写法有点不同
class Solution {
public int[] exchange(int[] nums) {
if (nums == null || nums.length == 0)
return new int[0];
int start = 0;
int end = nums.length - 1;
while (start <= end) {
if ((nums[start] & 1) == 1) {
start++;
continue;
}
if ((nums[end] & 1) == 0) {
end--;
continue;
}
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
}
return nums;
}
}
方法1: 在lc会超时
/**21 调整数组顺序使奇数位于偶数前面*/
public class C21_array_Reorder {
// 两个指针,首往后移,尾往前移
if(arr==null||arr.length==0){
return;
}
int start=0;
int end=arr.length-1;
while(start<end){
while (start<end&&!isEven(arr[start])){//奇数
start++;
}
while (start<end&&isEven(arr[end])){//偶数
end--;
}
if(arr[start]<arr[end]){
int temp = arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
}
}
static boolean isEven(int n){ //偶数
return (n&1)==0;
}
}
方法2:
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?f=discussion
来源:牛客网
/**
* 1.要想保证原有次序,则只能顺次移动或相邻交换。
* 2.i从左向右遍历,找到第一个偶数。
* 3.j从i+1开始向后找,直到找到第一个奇数。
* 4.将[i,...,j-1]的元素整体后移一位,最后将找到的奇数放入i位置,然后i++。
* 5.終止條件:j向後遍歷查找失敗。
*/
public void reOrderArray2(int [] a) {
if(a==null||a.length==0)
return;
int i = 0,j;
while(i<a.length){
while(i<a.length&&!isEven(a[i]))
i++;
j = i+1;
while(j<a.length&&isEven(a[j]))
j++;
if(j<a.length){
int tmp = a[j];
for (int j2 = j-1; j2 >=i; j2--) {
a[j2+1] = a[j2];
}
a[i++] = tmp;
}else{// 查找失敗
break;
}
}
}
boolean isEven(int n){
if(n%2==0)
return true;
return false;
}
```:
#### Test
```Java
public static void main(String[] args) {
int[] arr={1,2,3,4,5};
reOrder(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}