1. 题目描述
2. 解题思路
倘若不看题目中的说明,这道题目是非常简单的,做法也有很多。如果不限制时间复杂度为线性的话,我们可以先把数组进行排序,然后判断就很方便了,但这里限定的时间复杂度为线性,排序自然而然就不行了。
在不考虑空间复杂度的情况下,可以通过构造一个HashMap
,若HashMap
中没有这个数则存入,有这个数则删除,那么遍历一遍过后HashMap
中剩下来的就只有目标数了,然而限定不使用额外空间的话,这就又行不通了,只好去看看官解。
什么?异或?这是碳基生物能想出来的解法吗?异或的规则:
因此这道题目只需要把数组的数全部异或起来就是答案了,amazing!
3. 代码实现
3.1 HashMap
public int singleNumber(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
if (map.get(num) == null)
map.put(num, 1);
else
map.remove(num);
}
Set<Integer> keySet = map.keySet();
for (Integer integer : keySet) {
return integer;
}
return 0;
}
3.2 异或运算
public int singleNumber(int[] nums) {
int res=0;
for (int num : nums)
res ^= num;
return res;
}
3.3 对比
两种算法的时间复杂度都是O(n),而hashmap
的空间复杂度最坏的情况可以达到O(n),而牛逼轰轰的异或仅为O(1)。