方法一:用hashmap
扫一遍,记录每个元素出现的次数,再扫一遍,拿出value=1的key。
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
if (!map.containsKey(num)) {
map.put(num, 1);
} else {
map.put(num, map.get(num) + 1);
}
}
for (int k : map.keySet()) {
if (map.get(k) == 1) {
return k;
}
}
return 0;
}
}
方法二:位运算
- 任何数和0做异或运算,结果仍然是原来的数,即
a⊕0 = a - 任何数和其自身做异或运算,结果是0, 即
a⊕a = 0 - 异或运算满足交换律和结合律,
a⊕b⊕a = b⊕a⊕a = b⊕(a⊕a) = b⊕0 = b扫一遍,把每个数都异或一下,最终结果就是只出现过一次的数字。
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for (int num : nums) {
res = res ^ num; //异或符号^
}
return res;
}
}