给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗
输入: [2,2,1]
输出: 1
异或还可以用于交换两个元素的位置,而且不用多余的空间。可以代替temp,swap方法。
a =a^b;
b=a^b;
a=a^b;
用这三个语句可以代替swap方法:
方法一:最优方法:
这里利用异或的原理,a ^a=0 ; a ^0 =a;异或具有交换律;两个相同的值异或后还是自己。所以文中只有一个元素为奇数个,异或后只有一个为奇数个的元素。最后返回eor就是那个奇数个的元素。
class Solution {
public int singleNumber(int[] nums) {
int eor =0;
for(int i =0 ;i<nums.length;i++){
eor ^=nums[i];
}
return eor;
}
}
方法二:集合(常用的方法)
for循环
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (!set.add(num)) {
//如果添加失败,说明这个值
//在集合Set中存在,我们要
//把他给移除掉
set.remove(num);
}
}
//最终集合Set中只有一个元素,我们直接返回
return (int) set.toArray()[0];
}