【问题标题】:How to find a 2 unpaired elements in array?如何在数组中找到 2 个未配对的元素?
【发布时间】:2012-02-25 06:20:06
【问题描述】:

您有一个包含 n=2k+2 个元素的数组,其中 2 个元素没有配对。 8 个元素数组的示例:1 2 3 47 3 1 2 0。“47”和“0”在数组中没有配对。如果我有一个只有 1 个元素没有配对的数组,我用 XOR 解决这个问题。但我有 2 个未配对元素!我能做些什么?解决方案可能是 O(n) 时间性能和 O(1) 额外内存。

【问题讨论】:

  • 既然所有元素都是成对的,那是否意味着剩下的两个必须成对。你能详细说明一下你的描述吗?
  • 我在所有数组中只有 2 个未配对的元素,我需要找到它。
  • 您在寻找 O(n) 解决方案吗?排序很容易,得到 O(n*log(n))。
  • 元素的界限是什么?整数?我认为它可以线性完成,但有一些记忆(鸽子洞)
  • 是的,解决方案可能是 O(n) 时间性能和 O(1) 额外内存。让元素是整数

标签: c algorithm discrete-mathematics array-algorithms


【解决方案1】:

使用 INT_MAX/8 字节内存。走阵列。将每个值对应的位与 1 进行异或。如果有 0 或 2 个实例,则该位将以 0 结尾。如果只有一个实例,它将被设置。 O(1) 内存,O(N) 时间。

【讨论】:

  • 这不是 O(1),因为您调用了 INT_MAX。这是 O(N)。
  • O(N) 内存;您可以拥有N/2 + 2 不同的元素,并且每个元素都需要一点。
  • 而且...如果碰巧int 恰好是 64 位,那么祝您在地球上安装该位数组好运... ;-)
  • @real,这将产生一个数组,其中为任何出现奇数次的元素设置了一个位。识别设置了哪些位是常数时间,因为数组是常数大小。是的,这两个常数都很大,但它们是常数。
  • @R,对于任何给定的平台/实现,它都是恒定的。它恰好是一个非常大的常数。
【解决方案2】:

一些提示...

需要 2 次通过。首先,遍历列表并对所有元素进行异或。看看你得到了什么。从那里继续。

编辑:关于第一遍结果的关键观察应该是它向您显示了 2 个未配对元素不同的位集。

【讨论】:

  • 好的,我有 xor-result 这两个 unpair 元素。接下来我不知道是什么
  • 这看起来像是一个家庭作业/拼图问题,所以我尽量避免只给你答案。玩一点。我很确定以前也有人问过这个确切的问题,因此您可以选择搜索...
  • @user1185443,您应该多了解一下xor 操作。 xor 的另一个应用是在不使用额外空间的情况下更改两个元素。 a, b -> a = a xor b, b = a xor b, a = a xor b。这可能会有所帮助。
  • 这个问题来自采访。我已经想了2天!我真的没有机会想出答案
  • 在geeksforgeeks.org/archives/2457 找到了实际实现@R​​..
【解决方案3】:
  1. 扫描数组并将每个数字和计数放入哈希中。
  2. 重新扫描并找出 count=1 的项目。

这是 O(n)。

【讨论】:

  • 又需要多少内存?
  • 虽然这绝对是我将在生产代码中使用的解决方案,但 OP 中的空间要求是 O(1),这种方法无法满足。这个问题似乎是针对一个有点复杂的解决方案而设计的(参见 Shivam Singh 的回答:stackoverflow.com/a/43609845/2445184)。
【解决方案4】:

你可以试试这个,需要O(n)时间

        int xor = arr[0];
        int set_bit_no;
        int i;
        int x = 0; //First unpair number
        int y = 0; //second unpair number
        for (i = 1; i < n; i++)
            xor ^= arr[i];

        set_bit_no = xor & ~(xor-1);//Get the rightmost set bit in set_bit_no
        for (i = 0; i < n; i++)
        {
            if (arr[i] & set_bit_no) {
                //XOR of first set 
                x = x ^ arr[i];
            }
            else
            {
                //XOR of second set
                y = y ^ arr[i];
            }
        }

解释... arr[] = {2, 4, 7, 9, 2, 4} 1)获取所有元素的异或。 异或 = 2^4^7^9^2^4 = 14 (1110) 2) 获取一个只有一组异或的数字。
因为我们可以很容易地得到最右边的设置位,所以让我们使用它。 set_bit_no = xor & ~(xor-1) = (1110) & ~(1101) = 0010 现在 set_bit_no 将只设置为 xor 的最右边的设置位。 3) 现在将元素分成两组并进行异或
每个集合中的元素,我们得到不重复的 元素 7 和 9。

【讨论】:

  • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of 如何解决这个问题。没有这个,你的回答就没有多少教育价值了——记住你是在为未来的读者回答这个问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
  • 看不懂
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2022-11-22
  • 2017-12-08
  • 1970-01-01
相关资源
最近更新 更多