Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

 

  看到这个题目的时候,由于我第一语言是Java,第一反应是使用HashSet实现。

 

 1 public class Solution {
 2     public int singleNumber(int[] A) {
 3            HashSet<Integer> set = new HashSet<Integer>();
 4 
 5         for (int i = 0; i < A.length; i++) {
 6             if (!set.add(A[i])) {
 7                 set.remove(A[i]);
 8                 continue;
 9             }
10             set.add(A[i]);
11         }
12 
13         return set.iterator().next();
14     }
15 }

 

提交后发现超时了:( 。

 

于是又使用HashMap尝试

 1 public class Solution {
 2     public int singleNumber(int[] A) {
 3         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
 4         for (int i : A) {
 5             if (map.get(i) != null) {
 6                 map.remove(i);
 7                 continue;
 8             }
 9 
10             map.put(i, i);
11         }
12 
13         return map.keySet().iterator().next();
14     }
15 }

居然就通过了 :(.

据我所知,HashSet是使用HashMap实现的,为何就有如此差异呢。

 

而后看见Discuss中有号称4行的答案 

1 public class Solution {
2     public int singleNumber(int[] A) {
3        int n = 0;
4         for (int i : A) {
5             n ^= i;
6         }
7         return n;
8     }
9 }

巧妙的使用了位运算,异或的特性将相同的数字清零,而后剩下single num。

完全没有想到这种方法,安慰自己是写得少的关系,还需多多练习,多多积累。

 

posted on 2015-03-17 00:25  Sluggard  阅读(135)  评论(0编辑  收藏  举报