题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
思路
我想着,直接排序,然后找出不重复的值,因为重复的一定是两个两个在一起的
代码
import java.util.Arrays;
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int i;
for (i=0;i<nums.length-2;i+=2)
if (nums[i]!=nums[i+1])
break;
return nums[i];
}
}
结果
可是这完全不符合题目的要求,快排也要使用复杂度 O(nlogn),然后,思路想去,好像也没有什么好的办法,然后,就去看了题解,真的妙啊!
官方思路
利用异或,两个相同的数异或之后数值为0.那么,全部异或一遍,剩下那个数就是最终的结果。不得不佩服大佬,真的是太强了!
代码
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
结果
无敌,这种方法真的太秀了。学习了!!
今天发现了,奇数个相同的数异或结果为本身,一个数与0异或,结果为本身,偶数个相同的数之间进行异或,结果为0.
奇数个相同的数异或结果为数本身