1.题目描述
2.分析
由于题目要求该算法的时间复杂度为线性,所以不能使用暴力法来解决。线性复杂度应该考虑使用HashMap或HashSet。由于对HashMap比较熟悉,所以利用HashMap来解决该问题。
具体思路为:遍历数组,如果没有出现过这个数字,则value为1,如果出现过这个数字,则value为当前value的值+1.
然后再遍历HashMap的key,如果这个key的value值为1,则return这个key,否则就return -1.
3.具体代码如下
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer, Integer> hashmap = new HashMap<>();
for(int num : nums) {
if(hashmap.containsKey(num)) {
hashmap.put(num,hashmap.get(num)+1);
} else {
hashmap.put(num,1);
}
}
for(int i : hashmap.keySet()) {
if(hashmap.get(i) == 1)
return i;
}
return -1;
}
}
PS:
标准答案中用了HashMap的一个getOrDefault方法,能够代替containsKey方法,即:
hashmap.put(num, hashmap.getOrDefault(num, 0)+1);
与
if(hashmap.containsKey(num)) {
hashmap.put(num,hashmap.get(num)+1);
} else {
hashmap.put(num,1);
}
等价,这个方法比较方便,可以使用。
另外,有一位大神的博客,对于HashMap的keySet()方法分析得很好,传送门:源码解析HashMap的keySet()方法