Single Number II 除了一个元素外其他元素都出现3次 @LeetCode

第一种方法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;
    }
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值