有这么一道题,一个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);
 
异或还可以用于两个值交换,省交换空间,这个只是个技巧而已。