【发布时间】:2011-11-05 18:53:33
【问题描述】:
Given 是一个整数数组。数组中的每个数字出现奇数次,但只有 1 个数字出现偶数次。找到那个号码。
以下是我在 stackoverflow 上阅读的不起作用的解决方案。我找不到该解决方案的链接,我想知道是否有人可以帮助我理解为什么这个解决方案不正确,除非我在下面做错了什么。
我们首先对数组中的所有元素进行异或。让我们称之为aWithOutDuplicate,它包含除了重复元素之外的所有奇数元素。然后我们对所有元素进行 OR。让我们称它为aAllUnique,它应该包含所有独特的元素。异或 aWithOutDuplicate 和 aAllUnique 应该会吐出重复的元素。
int arr[] = {1,2,3,4,5,6,7,8,4,9};
int aWithOutDuplicate = 0;
int aAllUnique = 0;
for(int i=0;i<arr.length;i++) {
aWithOutDuplicate ^= arr[i];
aAllUnique |= arr[i];
}
cout << (aWithOutDuplicate ^ aAllUnique);
更新: 我想知道这个问题是否可以在 O(n) 时间和 O(1) 空间复杂度内解决。
【问题讨论】:
-
你错了。 {1,2,3,5,6,7,8,9}不重复。 {4} 重复一次。一个是奇数。或者您的意思是:“找出出现偶数次的数字”?
-
为了简单起见,我举了这个例子。当我说重复时,我的意思是该数字的出现次数。考虑到这个定义,只有 4 发生偶数次(2 次),其余奇数次(示例中为 1 次)。
-
我认为 wildplasser 的意思是重复一个数字会使所有出现在集合中彼此相邻出现。然而,我不认为“重复”这个词的定义需要这样做。
标签: algorithm