C++ 数组中的重复元素

C++ 数组中的重复元素,c++,algorithm,sorting,C++,Algorithm,Sorting,这有点和问题有关,但有点小改动。 我们得到一个包含1到1000之间整数的数组。 1和1000之间的每个整数在数组中都有一次,但一个整数在数组中有两次。(即,我从列表中删除一个唯一的元素,并引入一个已在列表中的重复元素,请记住数组的大小仍然是1000) 两次确定数组中的整数 您可以在只遍历数组一次的情况下执行此操作吗 在我发布的链接中,这是一个完全不同的问题 我的解决方案: 对数组进行排序,然后查找这两个元素是否在一起。(平均情况O(非直瞄(n))) 创建一个具有1000位的位数组(不会占用太多内

这有点和问题有关,但有点小改动。 我们得到一个包含1到1000之间整数的数组。
1和1000之间的每个整数在数组中都有一次,但一个整数在数组中有两次。(即,我从列表中删除一个唯一的元素,并引入一个已在列表中的重复元素,请记住数组的大小仍然是1000)

  • 两次确定数组中的整数
  • 您可以在只遍历数组一次的情况下执行此操作吗
  • 在我发布的链接中,这是一个完全不同的问题

    我的解决方案:

  • 对数组进行排序,然后查找这两个元素是否在一起。(平均情况O(非直瞄(n)))

  • 创建一个具有1000位的位数组(不会占用太多内存)。在每个位字段中存储0。迭代1000个元素的数组,并用数组的值翻转位数组索引中的位符号

  • i、 e.(如果数组的第0个位置存储值548,我们将位数组中的第548位翻转为1)

    已翻转为1的字段将是重复元素

    Solution2只迭代数组一次


    现在,我正在读“望远镜系列”,我还没有完全理解它。但是在那里(或者在离散数学中)有没有一个概念,我们可以对某个元素求和,然后用另一个元素减去,得到重复的数字?

    计算数组的和,让它为S,让重复的元素为x。重复元素可以通过取S和:x=S-(1000*(1001))/2

    的和1…1000=1001*500之间的差来确定,因此是零模1001。因此,找到数组模1001的和将得到重复元素

    result = 0
    for x in A:
        result = (result + x) % 1001
    

    1000不是那么大。除了其他人所说的之外,您还可以使用计数数组。对于每个数字x,您更新计数
    count[x]=count[x]+1
    ,并检查该数字是否等于
    2

    x
    替换为
    y
    。求和法告诉我们

    y - x = sum_actual - sum_expected
    
    当然,你不能从一个方程推导出两个变量;你需要另一个。计算平方和:

       y^2 - x^2 = sum_squares_actual - sum_squares_expected
    

    现在回想一下平方和是
    n*(n+1)*(2*n+1)/6

    使用求反法或异或法为什么不满足的第一个答案?您的第二个解决方案满足要求,但我认为不够优雅。嗯,到底有什么不同?问题出在哪里?
    1^2^…^1000^arr[0]^arr[1]^…^arr[1000]
    这能行吗?:)我从列表中删除一个唯一的元素并引入一个已在列表中的重复元素,请记住数组的大小仍然是1000,而不是1001)不,这不是我的问题陈述。请记住,我从列表中删除一个唯一的元素并引入一个已在列表中的重复元素,请记住,阵列的大小仍然是1000,而不是1001)。只有在我引入一个新的重复元素而不消除任何唯一元素的情况下,你的解决方案才有效。是的,这是正确的,你的问题令人困惑。如果是这种情况,请使用XOR方法。我已经在位数组中有了解决方案。我正在寻找一个更好的解决方案。我尝试了a=[1,2,3,4,5,6,6,7,8,9]。我没有得到解决办法。