Algorithm 在数组中查找重复整数的偶数次,其中其余整数重复奇数次

Algorithm 在数组中查找重复整数的偶数次,其中其余整数重复奇数次,algorithm,Algorithm,给定的是一个整数数组。数组中的每个数字出现奇数次,但只有一个数字出现偶数次。找到那个号码 下面是我在stackoverflow上读到的解决方案,它不起作用。我无法找到该解决方案的链接,我想知道是否有人可以帮助我理解为什么这个解决方案是不正确的,除非我在下面做了一些错误的事情 我们首先对数组中的所有元素进行异或运算。让我们称它为不重复的a,它包含除重复元素外的所有奇数元素。然后,我们就可以使用所有元素。让我们称之为aAllUnique,它应该包含所有唯一的元素。XORingA没有重复的和A所有唯一

给定的是一个整数数组。数组中的每个数字出现奇数次,但只有一个数字出现偶数次。找到那个号码

下面是我在stackoverflow上读到的解决方案,它不起作用。我无法找到该解决方案的链接,我想知道是否有人可以帮助我理解为什么这个解决方案是不正确的,除非我在下面做了一些错误的事情

我们首先对数组中的所有元素进行异或运算。让我们称它为不重复的
a,它包含除重复元素外的所有奇数元素。然后,我们就可以使用所有元素。让我们称之为
aAllUnique
,它应该包含所有唯一的元素。XORing
A没有重复的
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没有提醒我这一点,即使它在重命名时处理注释。更糟糕的是,我没有进行尽职调查…)