Algorithm 在数组中查找重复整数的偶数次,其中其余整数重复奇数次
给定的是一个整数数组。数组中的每个数字出现奇数次,但只有一个数字出现偶数次。找到那个号码 下面是我在stackoverflow上读到的解决方案,它不起作用。我无法找到该解决方案的链接,我想知道是否有人可以帮助我理解为什么这个解决方案是不正确的,除非我在下面做了一些错误的事情 我们首先对数组中的所有元素进行异或运算。让我们称它为不重复的Algorithm 在数组中查找重复整数的偶数次,其中其余整数重复奇数次,algorithm,Algorithm,给定的是一个整数数组。数组中的每个数字出现奇数次,但只有一个数字出现偶数次。找到那个号码 下面是我在stackoverflow上读到的解决方案,它不起作用。我无法找到该解决方案的链接,我想知道是否有人可以帮助我理解为什么这个解决方案是不正确的,除非我在下面做了一些错误的事情 我们首先对数组中的所有元素进行异或运算。让我们称它为不重复的a,它包含除重复元素外的所有奇数元素。然后,我们就可以使用所有元素。让我们称之为aAllUnique,它应该包含所有唯一的元素。XORingA没有重复的和A所有唯一
a,它包含除重复元素外的所有奇数元素。然后,我们就可以使用所有元素。让我们称之为aAllUnique
,它应该包含所有唯一的元素。XORingA没有重复的
和A所有唯一的
应该吐出重复的元素
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);
intarr[]={1,2,3,4,5,6,7,8,4,9};
int awithoutreplicate=0;
int aAllUnique=0;
对于(int i=0;i<p>),该方法不起作用,因为无法区分出现偶数次数的数字。
5: 1 0 1
10: 0 1 0 1
-----------
1 1 1 1 <- both or and xor.
5:10 1
10: 0 1 0 1
-----------
1假设你有一个数组:a,b,a,b,a,c
所以输出应该是b。
我将尝试解释为什么您的算法是空的。当您应用OR运算时,您假设您将得到唯一的数字。是的,当然,a | a | a==a,但是通过执行以下操作您将得到什么值:a | b | c==?(可能所有位都将设置为1,具体取决于a、b、c)
这与执行异或不同。对于大小为“n”的数组,只有当数组元素在[1,n-1]范围内时,此O(n),O(1)空间解决方案才有效。[将适用于[0,n-1],并在下面提到一些调整]
- 扫描阵列并执行以下操作
for(i=0; i < n; i++)
A[A[i]]=A[A[i]]*(-1)
(i=0;i
A[A[i]]=A[A[i]*(-1)
在扫描结束时,所有出现奇数的数组元素将有一个负值。出现偶数的元素将有一个正值
一些调整:
如果数组范围在[0,n-1]之间,则“0”可以有一个特殊情况,即在第一次传递期间用特殊字符替换“0”(而不是求反)。在第二次传递期间,您必须将特殊字符还原回“0”,以此类推。在下面的代码中,我找到了重复偶数次的数字,使用暴力方法,而不使用标准库函数映射:
//! Print integers occurring an even number of times in array a.
#include <iostream>
int main() {
int arr[] = { 9, 12, 23, 10, 12, 12, 15, 23, 14, 12, 15 };
int n = sizeof(arr) / sizeof(arr[0]);
int b[n], count = 0, c[100];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
if (arr[j] == arr[i])
b[i] = ++count;
count = 0;
}
for (int i = 0; i < n; i++)
c[arr[i]] = 0;
for (int i = 0; i < n; i++) {
if (c[arr[i]] == 1)
continue;
if (b[i] % 2 == 0)
std::cout << arr[i] << std::endl;
c[arr[i]]++;
}
return 0;
}
//!打印数组a中出现偶数次的整数。
#包括
int main(){
int arr[]={9,12,23,10,12,12,15,23,14,12,15};
int n=sizeof(arr)/sizeof(arr[0]);
int b[n],计数=0,c[100];
对于(int i=0;i 你可能错了。{1,2,3,5,6,7,8,9}不重复。{4}重复一次。一个是奇数。或者你的意思是:“找到偶数次出现的数字”?为了简单起见,我举了那个例子。当我说“重复”时,我的意思是指该数字出现的次数。记住这个定义,只有4次出现偶数次(2次),其余为奇数次(示例中为1次).我认为wildplasser所说的是重复一个数字会使所有发生的事件在集合中出现在一起。但是,我认为“重复”一词的定义并不要求这样做。[1,n-1]限制很烦人。但这真的很聪明,我找不到一个bug。+1.为什么它是一个常量空间?你需要内存中的输入数组才能工作。方法的描述看起来很切题。(我希望演示文稿更好,如果它1)包含注释,而所有不明显的东西都有2)缩进得更为传统:“全局事物”(如main()
)位于左侧边缘,8(或4)每个级别的空间3)节省的垂直空间:在不需要的地方没有大括号,打开大括号不是在自己的一行中。)不要习惯性地使用命名空间std;
。谢谢你的评论。请告诉我如何正确回答stackoverflow?因为我现在是这方面的初学者…(:你不可能知道你在要求什么;)其中一部分有一个预先准备好的答案:。还有一些更详细的答案-让我插一个。经验法则:你的帖子会被阅读很多次-应该在写作中尽职尽责(例如,使用拼写检查器,在需要的地方大写,标点符号后面的空格)。当评论要求提供更多信息或澄清时,请编辑您的帖子,而不是重新评论。感谢您的编辑…我了解了如何在堆栈溢出上编写代码…并将在编写进一步答案时遵循您的建议…再次感谢。。(刚刚检查并注意到一个错误:在数组a中
应该读在数组arr中
(或者在数组中
甚至
)。太糟糕了,我的IDE没有提醒我这一点,即使它在重命名时处理注释。更糟糕的是,我没有进行尽职调查…)