第一种方法Hashtable好想,第二种要用到bit vector
package Level3;
import java.util.Hashtable;
import java.util.Set;
/**
* Single Number II
*
* Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Discuss
*
*/
public class S129 {
public static void main(String[] args) {
int[] A = {7,5,4,4,4,5,5};
System.out.println(singleNumber(A));
System.out.println(singleNumber2(A));
}
// Time: O(n), space: O(n)
public static int singleNumber(int[] A) {
Hashtable<Integer, Integer> ht = new Hashtable<Integer, Integer>();
for(int i=0; i<A.length; i++){
Integer val = ht.get(A[i]);
if(val != null){
ht.put(A[i], val+1);
}else{
ht.put(A[i], 1);
}
}
Set<Integer> set = ht.keySet();
for (Integer i : set) {
if(ht.get(i) != 3){
return i;
}
}
return 0;
}
// Time: O(n), space: O(1)
// 基本思想是每个数都可以表示成二进制形式,进而统计每个数在每一位出现的次数
public static int singleNumber2(int[] A) {
// 创建一个长度为32的数组countsPerBit,
// countsPerBit[i]表示A中所有数字在i位出现的次数
int[] countsPerBit = new int[32];
int result = 0;
for(int i=0; i<32; i++){
for(int j=0; j<A.length; j++){
if(((A[j] >> i) & 1) == 1){
countsPerBit[i] = (countsPerBit[i] + 1) % 3;
}
}
result |= (countsPerBit[i] << i);
}
return result;
}
}
Ref:http://www.mitbbs.com/article_t/JobHunting/32547143.html
import java.util.*;
public class Solution {
public int singleNumber(int[] A) {
int[] buf = new int[32];
for(int i=0; i<32; i++){
int cnt = 0;
int p = 1;
p <<= i;
for(int j=0; j<A.length; j++){
int tmp = A[j];
if((tmp & p) != 0){ //!!! cannot use ==1
cnt++;
}
}
buf[i] = cnt%3;
}
int res = 0;
for(int i=0; i<32; i++){
res |= (buf[i] << i);
}
return res;
}
public int singleNumber2(int[] A) {
Hashtable<Integer, Integer> ht = new Hashtable<Integer,Integer>();
for(int i=0; i<A.length; i++){
Integer val = ht.get(A[i]);
if(val != null){
ht.put(A[i],val+1);
}else{
ht.put(A[i],1);
}
}
for(Integer key : ht.keySet()){
if(ht.get(key) != 3){
return key;
}
}
return -1;
}
}