package com.mxnet;
import java.util.HashSet;
public class Solution136 {
public static void main(String[] args) {
}
/**
* 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
* 说明:
* 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
*
* @param nums
* @return
* 使用hash结构,但是要花费额外空间
* 思路:
* 1. 由于hash结构的元素不重复特性,
* 2. 将所有元素尝试加入hash集合
* 3. 在添加的过程中,如果该元素已经存在hash集合中,则删除
* 4. 若不在hash集合中,则添加
* 5. 则到最后时hash集合中之上下不重复的元素,取出来返回即可
*/
public int singleNumber1(int[] nums) {
int single = 0;
HashSet<Integer> integers = new HashSet<>();
for (int num : nums) {
//该元素若已经存在hash集合中则删除
if (integers.contains(num)) {
integers.remove(num);
} else {
//若不存在则添加
integers.add(num);
}
}
//取出不重复的元素
for (Integer integer : integers) {
single = integer;
}
return single;
}
/**
* 使用位运算的方法,不需要额外空间
* @param nums
* @return
* 思路
* 1. 由位运算的性质
* 2. 不需要额外空间即可知道不重复元素
*/
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}