先说使用额外空间实现的常规解法:
判断只出现一次,自然的想到哈希表。
思路是:建立一个形式为num-count的hashmap。遍历数组,如果map.get(num)为null则对应count记为1,如果不为null则次数加一。
之后遍历hashmap,取出count等于1的key。
注意hashmap不能放基本类型,而是放Interger
class Solution { public int singleNumber(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for (Integer i : nums) { Integer count = map.get(i); count = count == null ? 1 : ++count; map.put(i, count); //这个有直接覆盖的效果 } for (Integer i : map.keySet()) { Integer count = map.get(i); if (count == 1) { return i; } } return -1; // can't find it. } }
Time: O(n) Space: O(n)
不使用额外空间,一开始完全无想法,这里学习到了一种新的方法:异或操作
这个性质也太巧妙了,可谓就是为这道题准备的。。。
一路异或过去,又满足结合律和交换律,其余成对异或出来都是0,一堆0互相异或也是0,只剩落单的数和0一异或就成了本身。
class Solution { public int singleNumber(int[] nums) { int single = 0; for (int num : nums) { single ^= num; } return single; } }