给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
算法应该具有线性时间复杂度。 不使用额外空间来实现
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
1.异或方法
public class Solution136_singleNumber {
public int singleNumber(int[] nums) {
int ans=nums[0];
for(int i=1;i<nums.length;i++){
ans^=nums[i];
}
return ans;
}
public static void main(String[] args) {
Solution136_singleNumber solution136_singleNumber=new Solution136_singleNumber();
int []num={4,1,2,1,2};
//异或操作 相同为0相异为1 0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
//1. a ⊕ a = 0
//2. a ⊕ b = b ⊕ a
//3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
//4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
//5. a ⊕ b ⊕ a = b.
System.out.println(solution136_singleNumber.singleNumber(num));
}
}
2.哈希表(空间复杂度为O(n)不符合题意)
public class Solution136_singleNumber {
public int singleNumber(int[] nums) {
int ans=nums[0];
Map<Integer,Integer>temp=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(!temp.containsKey(nums[i])){
temp.put((nums[i]),1);
}
else {
temp.put(nums[i],temp.get(nums[i])+1);
}
}
for(int i=0;i<nums.length;i++){
if(temp.get(nums[i])==1){
ans=nums[i];
}
}
return ans;
}
public static void main(String[] args) {
Solution136_singleNumber solution136_singleNumber=new Solution136_singleNumber();
int []num={4,1,2,1,2};
System.out.println(solution136_singleNumber.singleNumber(num));
}
}