Single Number

Single Number

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?

 1 import java.util.Hashtable;
 2 public class Solution {
 3     public int singleNumber(int[] A) {
 4         Hashtable<Integer, Integer> hashtable = new Hashtable<Integer,Integer>();
 5         int result = 0;
 6         
 7         for(int i = 0; i < A.length;i++){
 8             Integer element = hashtable.get(A[i]);
 9             if(null == element){
10                 hashtable.put(A[i], 1);//第一次放1
11             }
12             else if(1 == element){
13                 hashtable.put(A[i], 2);//第二次放2
14             }
15         }//for
16         for(int i = 0; i < A.length; i++){
17             if(1 == hashtable.get(A[i])){
18                 result = A[i];
19                 break;
20             }
21         }//for
22         return result;
23     }
24 }

 ps

因为题目有要求,用O(1)空间,O(n)时间复杂度,用了hash表后,空间复杂度变为了O(n)

这里可以用异或来处理

异或具有交换性,a ^ b = b ^ a

0 ^ a = a

将所有的A[i]异或起来,A[0] ^ A[1]....这样根据交换性,最后只剩下单个的个数

只扫描了一遍,时间复杂度为O(N),只用了一个存储单元空间复杂度为O(1)

参考:http://www.cnblogs.com/changchengxiao/p/3413294.html

 1 public class Solution {
 2     public int singleNumber(int[] A) {
 3         int result = 0;
 4         for(int i = 0; i < A.length; i++){
 5             result ^= A[i];
 6         }
 7         
 8         return result;
 9     }
10 }
原文地址:https://www.cnblogs.com/luckygxf/p/4104371.html