题目
题解
开始我的思路是通过数组A[i]^i然后取其二进制最后一个数判断是否为1,就知道是否A[i]和i是否奇偶相异。然后从后找与i不相异的A[j]互换。通过for循环到A的倒数第二个元素位置,后面发现不行因为会超时。
所以来看看官方题解
另外貌似判断奇偶只需要对二取余就好= =
解法一:
新建一个同A数组同长的数组B,遍历A数组,是奇数就放进B[1],B[3],B[5].偶数就放进B[0] B[2] B[3]
class Solution {
public int[] sortArrayByParityII(int[] A) {
int n = A.length;
int[] ans = new int[n];
int i = 0;
for (int x : A) {
if (x % 2 == 0) {
ans[i] = x;
i += 2;
}
}
i = 1;
for (int x : A) {
if (x % 2 == 1) {
ans[i] = x;
i += 2;
}
}
return ans;
}
}
解法二:用i=0,j=1。i每次+2,用来遍历数组偶数下标,如若发现A[i]是奇数,则与A[j]为偶数的互换 ,若A[j]不为偶,则j+=2 继续找直到有A[j]满足互换要求
package LeetCode;
class Solution {
public static int[] sortArrayByParityII(int[] A) {
int i;
int j=1;
int n=A.length;
for(i=0;i<n;i+=2){
if(A[i]%2!=0){
while(A[j]%2==1){
j+=2;
}
swap(A,i,j);
}
}
return A;
}
public static void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
public static void main(String[] args){
int[] test = {4,2,5,7};
int[] answer = sortArrayByParityII(test);
for(int i:answer){
System.out.print(i+" ");
}
}
}