题目:
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。
示例:
输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5]也会被接受
分析一:
创建一个新数组arr,然后遍历数组A,将奇数放入新数组arr下标为奇的位置,将偶数放入新数组arr下标为偶的位置。
代码如下:
class Solution {
public int[] sortArrayByParityII(int[] A) {
int[] arr = new int[A.length]; //创建一个新数组arr,长度和数组A一样
int index1 = 0; //对应偶数下标
int index2 = 1; //对应奇数下标
for(int i =0;i<arr.length;i++){
if(A[i]%2==0){
arr[index1] = A[i]; //0 2 4 6.....
index1+=2;
}else if(A[i]%2==1){
arr[index2] = A[i]; //1 3 5 7......
index2+=2;
}
}
return arr;
}
}
分析二:
在不浪费空间的情况下,然后在原数组上进行排序;
已知原数组偶数和奇数的位置是相对的,只需要把他们一种排好序,另一种也就排好了
要遍历偶数下标 ,判断偶数下标所对应的位置是否为偶数,若不是则要遍历奇数下标,与奇数下标所对应的位置的偶数进行互换位置。
代码如下:
class Solution {
public int[] sortArrayByParityII(int[] A) {
int j=1; //奇数下标
for(int i=0;i<A.length;i+=2){ //偶数下标
if(A[i]%2==1){ //若偶数下标对应的元素为奇数则要换为偶数
while(j<A.length){ //遍历奇数下标
if(A[j]%2==0){
int temp = A[j];
A[j] = A[i];
A[i] = temp;
j+=2;
break;
}
j+=2;
}
}
}
return A;
}
}