LeetCode -- Single Number II

Question:

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?

 

Analysis:

给出一个整数数组,除了一个数字只出现一次外,其他的数字均出现3次,找到那个只出现一次的特殊数字。

注意:你的算法应该在线性时间复杂度内完成。可以不用额外的空间完成任务吗?

这种 N + 1 找1 模式的题目,应该很容易想到用位运算求解。由于在这个问题中,N = 3是奇数,因此我们不能简单的使用异或运算解决。想象一下,将数组中每个数字都转化为二进制的表示形式。那么在32位数组中,将所有数字按位相加,一共会有三种情况:

a. 结果为所有出现3次的数字的对应位相加之和,为 3 * n;

b. 结果为所有出现3次的数字的对应位与特殊数字的对应位相加之和,为 3 * n + 1;

c. 结果为只有特殊数字的对应位,为 1.

因此,我们只需将数组中的所有数字按位相加然后按3去模即可得到只出现一次的特殊数字。

 

Answer:

public class Solution {
    public int singleNumber(int[] A) {
        int result = 0;
        int[] a = new int[32];
        for(int i=0; i<A.length; i++) {
            for(int j=0; j<a.length; j++) {
                if((A[i] & (1 << j)) != 0) 
                    a[j] = (a[j] + 1) % 3;
            }
        }
        for(int i=0; i<32; i++) {
            if(a[i] > 0)
                result |= (a[i] << i);
        }
        return result;
    }
}

 

 

posted @ 2016-02-19 11:05  江湖小妞  阅读(137)  评论(0编辑  收藏  举报