LeetCode | 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?

题目:数组中只有一个例外只出现一次,其他都出现三次

位运算实现:

Java中位运算:与(&),或(|),非(~),异或(^)【同0异1】,左移(<<),右移(>>)
Java中的int是用(4byte=32bit)表示的。Java中各类型字节数是由JVM决定的,与系统或平台无关
解法:主要思想是通过32次循环,把result的32个二进制位一位一位的拼出来,为O(32N)复杂度的算法
原理:用一个bit_count来标记数组所有项在第i二进制位为1的总位数,如果bit_count能整除3【mod 3】,说明result在这个二进制位为0,如果余1就说明result在这个二进制位为1
通用的算法,如果不是重复3次而是K次,就用mod k来确定result的二进制位。

 

public class Solution {
    public int singleNumber(int[] A) {
        int result = 0;                      //result初始为32位0
         
        for(int i=0; i<=32; i++){            //i=0代表32为中的倒数第一位  
            int bit_count = 0;               //bit_count表示i位为1的计数
            for(int j=0; j<A.length; j++){
                bit_count += (A[j]>>i) & 1;  //把A[j]右移i位,再与000...0001按位与,则A[j]的i位为0结果为0,i位为1结果为1,类似累加
            }
            result |= (bit_count%3)<<i;      // bit_count%3要么为0要么为1,为1就说明result的i位为1,将其左移i位放到正确位置
        }
        return result;
    }
}

Map<A[i], count>实现:其时间复杂度满足要求,只是需要额外的内存

public class Solution {
    public int singleNumber(int[] A) {
        int result = 0;
        Map<Integer,Integer> hashMap = new HashMap<Integer,Integer>();   //Map<A[i],count>
        for(int i=0; i<A.length; i++){
            if(hashMap.containsKey(A[i])){
                hashMap.put(A[i],hashMap.get(A[i])+1);
            }else{
                hashMap.put(A[i],1);
            }
        }
        
        Iterator<Map.Entry<Integer,Integer>> iterator = hashMap.entrySet().iterator();
        while(iterator.hasNext()){
            Map.Entry<Integer,Integer> entry = iterator.next();
            if(entry.getValue()!=3){
                result = entry.getKey();
                break;
            }
        }
        return result;
    }
}





原文地址:https://www.cnblogs.com/dosmile/p/6444462.html