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?

 

Ref :http://fisherlei.blogspot.com/2013/11/leetcode-single-number-ii-solution.html

[Thoughts]

这个题有类似于single number的解法,即通过位运算,一遍扫描得到结果。还是读书的时候见过,大概是两个变量,相互做异或、补之类的运算,早不记得详情了。

现在的解法是比较普通的。因为题目已经说了,除了一个数字以外,其他的都出现了3次,如果我们把那个特殊的数剔除,并把剩下的数于每一位来加和的话,每一位上1出现的次数必然都是3的倍数。所以,解法就在这里,将每一位数字分解到32个bit上,统计每一个bit上1出现的次数。最后对于每一个bit上1出现的个数对3取模,剩下的就是结果。

public class Solution {
    public int singleNumber(int[] A) {
        int[] bit=new int[32];
        // 把 A[] 中的数转换为二进制数,每一位相加,防盗一个32位数组中去
        for(int i=0;i<A.length;i++){
            for(int j=0;j<32;j++){
                // &1 相当于 A[i] & 00001 只取到A[i]的最低位
                bit[j]+=(A[i]>>j&1);
            }
        }
        int ret=0;
        // 因为所有元素出现了3次,除了一个出现了一次的元素。 取余3 剩下的数就是那个元素
        for(int i=0;i<32;i++){
            ret+=(bit[i]%3)<<i;
        }
        return ret;
    }
}

 

posted @ 2014-02-20 14:45  Razer.Lu  阅读(196)  评论(0编辑  收藏  举报