**题目:**给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
第一种方法:用Set实现
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> s=new HashSet<>();
for(int i=0;i<nums.length;++i){
//add:如果指定的元素不存在,则将其指定的元素添加
//如果要添加的元素存在,则返回false
//所以当重复的数字要add时,if成立,则删除这个重复的数字
if(!s.add(nums[i])){
s.remove(nums[i]);
}
}
//此时s里只剩下一个不重复的数字了
Object[] o=s.toArray();
//返回0号下标的元素,即返回不重复的数字
return (int)o[0];
}
}
第二种方法:异或
class Solution {
public int singleNumber(int[] nums) {
int ret=0;
for(int i=0;i<nums.length;++i){
ret^=nums[i];
}
return ret;
}
}