异或交换两个数总觉得很舒服,毕竟不需要第三个变量得参与。好比生活种不想多麻烦其他得人一样。但是今天刷到一个题需要交换数组中的的两个数的时候却莫名出现了0。百思不得答案就和女朋友吃饭去了、、、、
下午回来发现了坑点。
先附上题和代码
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4] 输出:[2,4,3,1] 输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
提示:
1 <= A.length <= 5000 0 <= A[i] <= 5000
错误的代码
class Solution {
public int[] sortArrayByParity(int[] A) {
int i = 0;
int j = A.length -1;
int tem;
while(i < j) {
while(A[i] % 2 == 0 && i < j) i++; //最终目的就是左边是偶数
//右边是奇数,左边一旦出现奇数就跳出while
while(A[j] % 2 == 1 && i < j) j--;//右边一旦出现偶数就跳出while
//交换
A[i] = A[i] ^ A[j];
A[j] = A[i] ^ A[j];
A[i] = A[i] ^ A[j];
}
return A;
}
}
上面的代码看似完美。但是答案却是很震惊。莫名从天而降了0
原来在第一次while后 序列变成了 4 1 2 3
然后 i < j 继续while 之后 变成了 4 2 1 3 预计的效果已经达到,
但是现在 i = 1,j = 2。 而然会进行while 。之后
while(A[i] % 2 == 0 && i < j) i++;
还会执行。
现在 i=2,j=2,
while(A[j] % 2 == 1 && i < j) j--;
不会执行
A[i] = A[i] ^ A[j];
A[j] = A[i] ^ A[j];
A[i] = A[i] ^ A[j];
上面的三个 还会执行
就是 1 = 1^ 1;执行三次 过程是这样的
1 = 1 ^ 1 -->0
0 = 0 ^ 0 -->0
0 = 0 ^ 0 -->0
所以出现了0
好了 现在问题已经发现了就改掉把
之所以出现问题就是 i == j 了就不用交换了 所有加个判断
class Solution {
public int[] sortArrayByParity(int[] A) {
int i = 0;
int j = A.length -1;
int tem;
while(i < j) {
while(A[i] % 2 == 0 && i < j) i++;
while(A[j] % 2 == 1 && i < j) j--;
if(i == j) {
break;
}
A[i] = A[i] ^ A[j];
A[j] = A[i] ^ A[j];
A[i] = A[i] ^ A[j];
// tem = A[i];
// A[i] = A[j];
// A[j] = tem;
}
return A;
}
}