线性时间,常数空间算法,用于查找列表中出现1次的元素

时间:2015-03-02 13:22:18

标签: algorithm list constants time-complexity space-complexity

给定n个整数的列表,其中列表中的每个整数都存在两次,但一个元素除外,该元素在列表中存在一次。例如,

[1 3 3 6 2 7 1 2 7]

我需要找到一个线性时间O(n)和一个常量空间O(1)算法,该算法返回列表中存在一次的元素。在上面的例子中,算法应该返回6。 请注意,任何特定订单均不提供该列表。 (列表中元素的顺序是随机的)。

我可以使用字典在O(n)线性时间内解决这个问题但不幸的是字典需要O(n)空间。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

解决这个难题需要了解一个小技巧:XOR - 一个数字本身甚至次数都会导致零。此外,你可以XOR其他数字,其间有临时结果;订单无关紧要。

因此,如果您将XOR数组中的所有值放在一起,您将只获得阵列中唯一的数字:

int res = 0;
for (int i = 0 ; i != array.size() ; i++) {
    res ^= array[i];
}
cout << res << endl;

答案 1 :(得分:2)

您可以一起xx列表中的所有数字。结果将是非重复元素。