题目描述
我的答案【存在问题】
只能算出偶数个数,在处理奇数位数组长度存在问题;而且只能是偶数开头;
自己想的思路是用双指针,用快排的思想,在原地处理数组。但是在处理奇偶数位时不能灵活的调整指针。
- 当次判断首为奇数,末为偶数时交换值
- 如果当次判断首为偶数,前指针指向下一位
- 如果当次判断末为奇数,后指针指向前一位
- 当两指针相遇时,结束循环
参考评论区的修改完善
public int[] sortArrayByParity(int[] A) {
int i = 0;
int j = A.length - 1;
while (i < j) {
if (A[i] % 2 != 0 && A[j] % 2 == 0) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
if (A[i] % 2 == 0) i++;
if (A[j] % 2 != 0) j--;
}
return A;
}
查看完官方题解,发现处理很精妙。
- 确保首数为偶,尾数为奇
A[i] % 2 > A[j] % 2
- 调整子序列,首尾奇偶数调换,子元素奇偶个数调整
if (A[i] % 2 == 0) i++;
if (A[j] % 2 == 1) j--;
题解一
双指针
public int[] sortArrayByParity(int[] A) {
int i = 0;
int j = A.length - 1;
while (i < j) {
//确保i指向奇数,j指向偶数时交换
if (A[i] % 2 > A[j] % 2) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
//首数为偶,尾数为奇,符合条件不做判断
if (A[i] % 2 == 0) i++;
if (A[j] % 2 == 1) j--;
}
return A;
}
【复杂度分析】
- 时间复杂度:O(N),其中 N 是 A 的长度
- 空间复杂度:O(1),不需要额外空间
题解二
开辟新数组,先赋值偶数,再赋值奇数
public int[] sortArrayByParity(int[] A) {
int[] B = new int[A.length];
int t = 0;
for (int i = 0; i < A.length; i++) {
if(A[i] % 2 == 0)
B[t++] = A[i];
}
for (int i = 0; i < A.length; i++) {
if(A[i] % 2 == 1)
B[t++] = A[i];
}
return B;
}
【复杂度分析】
- 时间复杂度:O(N),其中 NN 是 A 的长度
- 空间复杂度:O(N),存储结果的数组