不重复int数组里找不存在的值

有这么一道题,一个int数组叫A,里面的数是不重复的,从中拿出一个值,剩下的数组就B,问拿出的是哪个数。

一般人都能想到把A数组值相加,假设和为sum1,再把B数组值相加,设其和为sum2,sum1-sum2就是拿出的数。当初manager面我是,我就是这么回答的,心里还想怎么这么简单的题目还问(当时他出的int数组是从1到10的)。

其实这道题是有陷阱的啊,因为int数组值相加,可能会溢出!还好manager的数组是从1到10,不可能溢出。

对上面的方法有个改进的方法,就是对A中值相加时,每加一个值就减去B中的一个值,这样可以减少溢出的可能性。

但是改进过的方法还是有可能溢出,下面列出一个方法,不会有溢出:

离散数学里,大家都学过xor,异或,两个相同的值异或,值是0,两个不同的值异或,值是1,0和任何数异或都是那个数,0和0异或是0,0和1异或是1。
所以对于上面的题,我们定义一个int值,就叫xor吧,把A中每个值用循环异或一下赋以xor,再用xor去异或B中的每个值,做完后,xor就是拿出来的数。

int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] arr1 = new int[] { 1, 2, 3, 4, 5, 7, 8, 9, 10 };

int xor = 0;//xor初值要为0

for (int i = 0; i < arr.Length; i++)
{
    xor = xor ^ arr[i]; 
}

for (int i = 0; i < arr1.Length; i++)
{
    xor = xor ^ arr1[i];
}

Console.WriteLine(xor);
 
异或还可以用于两个值交换,省交换空间,这个只是个技巧而已。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值