【问题标题】:Duplicate element in array [duplicate]数组中的重复元素[重复]
【发布时间】:2015-03-13 14:35:33
【问题描述】:

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

  1. 确定数组中的整数两次
  2. 你能在数组中只迭代一次吗?

在我发布的链接中,这是一个完全不同的问题。

我的解决方案:

  1. 对数组进行排序,然后查找两个元素是否在一起。 (平均情况 O(nlog(n)))

  2. 创建一个 1000 位的位数组(不会占用太多内存)。 0 存储在每个位字段中。遍历包含 1000 个元素的数组,并将位数组索引中的位符号翻转为数组的值。

即(如果数组的第 0 位存储的值是 548,我们将位数组中的第 548 位翻转为 1)。

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

Solution2 只对数组进行一次迭代。

现在,我正在阅读“望远镜系列”,我还没有完全理解它。但是那里(或在离散数学中)是否有一个概念,我们可以将一些东西相加并用其他东西减去以获得重复的数字?

【问题讨论】:

  • 使用否定法或异或法
  • 你为什么不满足stackoverflow.com/questions/2605766的第一个答案?您的第二个解决方案满足要求,但我认为不太优雅。
  • 嗯,到底有什么不同?转折点在哪里?
  • 1^2^...^1000^arr[0]^arr[1]^...^arr[1000] 这行得通吗? :)
  • 我从列表中删除了一个唯一元素并引入了一个已经在列表中的重复元素,记住数组的大小仍然是 1000,而不是 1001)

标签: c++ algorithm sorting


【解决方案1】:

计算数组的总和,设为S,重复的元素为x。重复元素可以通过取Ssum of the array without the repeated element之间的差来确定:x=S- (1000*(1001))/2

【讨论】:

  • 不,这不是我的问题陈述。记住,我从列表中删除了一个唯一元素并引入了一个已经在列表中的重复元素,记住数组的大小仍然是 1000,而不是 1001 )。仅当我引入新的重复元素而不消除任何唯一元素时,您的解决方案才有效。
  • 是的,这是正确的,你的问题很令人困惑,如果是这样的话,请使用 XOR 方法
【解决方案2】:

假设xy 取代。求和法告诉我们

y - x = sum_actual - sum_expected

当然,你不能从一个方程中推导出两个变量;你需要另一个。计算平方和:

   y^2 - x^2 = sum_squares_actual - sum_squares_expected

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

【讨论】:

    【解决方案3】:

    1...1000 之和 = 1001 * 500,因此以 1001 为模为零。因此,找到以 1001 为模的数组之和将为您提供重复的元素。

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

    【讨论】:

    • 我试过这个 A=[1,2,3,4,5,6,6,7,8,9] 。我没有得到解决方案。
    【解决方案4】:

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

    【讨论】:

    • 我已经有了位数组的解决方案。我正在寻找更好的解决方案。
    猜你喜欢
    • 2018-07-02
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2013-03-23
    • 2013-05-20
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多