起因
前两天跟我大哥出去吃饭的时候,他说从京东辞职去瓜子了。立马让他给我讲一下都有什么面试题可以让我学习一下的。他就提到了异或算法。
问题
给你一堆数字,其中只有一个单身的,其他都是成对的。(先为这个单身的数字默默的默个哀),如何用最快的方法来找出这个孤单的数字。
解决方案
正常来说第一时间跑到脑子里面的就是开始双重for循环吧,这样肯定不会是面试官想要的答案。那么最合适的当然就是异或运算。另外一个朋友说的定义一个与数组中不会重复的值,开始与数组中的每个元素都做异或运算,最后得出的就是那个单身的元素。比如说就是[1,1,2,2,3], 给一个变量answer为0。1与0做异或运算为1,1与1为0,那么随后的就是3.我当时有点不太理解,如果不是按照你这样的顺序呢,就不对了呀。但是他说不会的,异或运算遵守着交换律,不管怎么样得出的都会是3。一直都没有理解,因为这个问题一直在脑子里转火锅吃的也没有很开心。等到家立马看一下异或运算到底是怎么一回事。
实验
public class Test {
public static int FindSingleDog() {
int[] arr = {1,2,3,4,5,1,2,3,4};
int answer = 0;
for (int i = 0; i<arr.length; i++) {
answer = arr[i] ^ answer;
}
return answer;
}
}
果不其然最后返回的就是5,但是我debug一步一步看的时候发现第二步1与2做异或运算的时候为3,我又懵逼了,为什么呢?又查找了一下资料,发现原来是使用转化为二进制来进行操作的,1则是0001,2则是0010,异或为0011.这不就是3了么。0001与0001做异或为0000不就变成0了。果然是还要先看一下这些运算的解释再进行试验会理解的快一点。哈哈哈,明天七夕提前拉拉自己单身狗的被子。