异或算法的执行过程

异或算法

问题

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。如输入: [4,1,2,1,2],输出:4←

代码

public class C {
   public static void main(String[] args) {
       int[] a = {4,1,2,1,2};
       int ii = num(a);
       System.out.println(ii);
   }
   public static int num(int[] a) {
	   int n=0;
	   for(int i=0;i<a.length;i++) {
		    n=n^a[i];
	   }
	   return n;
   }
}

二进制转换:
4: 0100 1: 0001 2: 0010 1: 0001 2: 0010
循环开始:第一次:4: 0100 ^ 1: 0001 = 0001-0100 = 0101:5=n
第二次:5: 0101 ^ 2: 0010 = 0010-0101 = 0111:7=n
第三次: 7: 0111 ^ 1: 0001 = 0001-0111 = 0110:5=n
第四次: 5: 0110 ^ 2: 0010 = 0010-0110 = 0100:4=n

总结

网上有些人说异步算法对两个数进行比较相同返回0不相同返回1,算法还是先将数值转换为二进制然后用后边的数减去前边的的数,最后得到的二进制数就是数组里唯一的那个数。

注意

使用异或算法在对数组进行运算时,数组中只能有一个元素个数为奇数,其他的都为偶数,否则运算的结果会受到影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值