LiCode的收获之异或交换出现0的坑

异或交换两个数总觉得很舒服,毕竟不需要第三个变量得参与。好比生活种不想多麻烦其他得人一样。但是今天刷到一个题需要交换数组中的的两个数的时候却莫名出现了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;
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值