从大三开始,给自己立下了刷LeetCode的flag。一方面是巩固已经快要淡忘的算法与数据结构知识,另一方面也是为保研的机试作准备。我的第一篇CSDN博客就献给这道题。
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
看完这道题,我的脑海中立马浮现出了两种方法,一种是对数组先排序再找数,另一种是使用map记录各数出现的频数。然而前者不是线性时间复杂度,后者需要使用额外空间。冥想良久,无果,遂百度求解。知道真相的我禁不住老泪纵横……废话不多说,直接show the code!
int xor = 0;
for (int i = 0; i < nums.length; i++ ) {
xor ^= nums[i];
}
return xor;
这也太666了,就运用了异或的两个性质:
-
A xor A = 0
-
A xor 0 = A
只要对数组的元素挨个异或,再运用一下交换律,成双成对的都被干成0,而最后落单的那位与0异或还是他自身,就这么得出了结果……我只想说,如果我现在就匆忙献上了膝盖,那我以后可能连四肢都不保了……