题目
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-array-by-parity
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的代码
class Solution {
public int[] sortArrayByParity(int[] A) {
if (A.length == 1) {return A;}
for (int i=0,j=A.length-1; i<j; i++,j--) {
while (A[i]%2 == 0) {
i++;
if (i >= j) {break;}
}
while (A[j]%2 == 1) {
j--;
if (i >= j) {break;}
}
if (i >= j) {break;}
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
return A;
}
}
小结
真的是非常非常非常非常挫败的一题。
脑子里一直没有很好的双指针的概念,导致一开始的打算是用两个数组分别存奇数和偶数,然后数组合并。
按照python的写法,是不可能存在数组越界问题的,但是java是有的,但我也不愿意预先new一个超出所需长度的数组。于是我发现了ArrayList。
但是这个ArrayList真的好难啊,add的内容必须是一个对象(Object)。这不是要命吗?我当然一开始是完全不知道该怎么办的。然后看到一个例子是add(new Integer(1),可谓豁然开朗。
那么新的问题又来了,最后需要返回的是一个int[],这里就涉及list2array的问题,于是我发现了方法toArray(),新的问题又来了,这个方法返回Object[],真的,我不知道该如何把它转换回int[],至今都不知道。
最后崩溃的我偷瞄了一眼评论区大神,意识到了双指针方法。
但是事情并没有结束,运行过程中还遇到了数组越界问题,我很费解,这如何越界?
原来是,如果数组内所有的数都是偶数或者奇数,按照我的while逻辑指针会越界。
不说了,都是累,还很菜,路还很长。
官方更优解
class Solution {
public int[] sortArrayByParity(int[] A) {
int start = 0;
int end = A.length-1;
while (start < end){
if (A[start]%2 == 1 && A[end]%2 == 0){
int tmp = A[start];
A[start] = A[end];
A[end] = tmp;
start++;
end--;
}else if(A[start]%2 == 0 && A[end]%2 == 0){
start++;
}else if (A[start]%2 == 1 && A[end]%2 == 1){
end--;
}else{
start++;
end--;
}
}
return A;
}
}
恍然大悟,两个指针的位置应该一起作为检测标准,只检测一个越界判断就会像我最终实现的方案一样复杂。