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

来源:互联网 发布:羊绒品牌 知乎 编辑:程序博客网 时间:2024/05/21 10:57

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


原创粉丝点击