成对或三元组中查找单个数字的最佳方法

时间:2016-01-20 18:14:39

标签: algorithm

这是一系列问题中的一个问题。我正在修改它以使其不与其他的重复。感谢您的帮助。

:我有一个整数数组。在数组中,除了一个元素外,每个元素都会出现两次。我想找到那个单号。

示例:[2, 4, 2, 1, 4, 1, 3],单个号码为3

我的想法是使用HashMap,这需要O(n)时间和O(n)空间。还有更好的解决方案吗?感谢。

三元组:除了一个元素外,每个元素都会出现三次。找到那一个。

示例:[1, 2, 4, 2, 4, 1, 2, 4, 1, 3],单个号码为3

1 个答案:

答案 0 :(得分:6)

考虑以“位”方式解决它,这需要O(n)时间和O(1)空间:

public class Solution {
    public int singleNumber(int[] A) {
        if (A.length==0) return 0;
        if (A.length==1) return A[0];

        int result = A[0];

        for (int i=1; i<A.length; i++) {
            result = result ^ A[i];
        }

        return result;         
    }
}

嗯,是的,我也有解决方案,可以在三元组中找到单一的。

public class Solution {
    public int singleNumber(int[] A) {
        int result = 0;

        for (int i = 0; i < 32; i++) {
            int curr = 0;
            for (int num : A) {
                curr += (num >> i) & 1;
            }
            result += (curr % 3) << i;
        }

        return result;
    }
}

这对您来说可能更难理解。请阅读一些有关位操作的资料,然后弄清楚这个解决方案的工作原理。