【发布时间】:2022-01-15 08:45:30
【问题描述】:
给定一个包含 n 个整数的数组,所有数字都是唯一的,但其中一个除外。
-
如果n为偶数,则重复数重复n/2次
-
如果 n 为奇数,则重复数重复 (n-1)/2 或 (n+1)/2 次p>
-
重复数在数组中与自身不相邻
编写一个程序来查找重复的数字而不使用额外的空间。
这就是我试图解决问题的方法。
如果 n 是偶数,则有 n/2 个重复元素。此外,重复元素不应相邻。因此,如果说有 6 个元素,则重复 3 个元素。元素可以在索引 0,2 和 4 或 1,3 和 5 处。因此,如果我只检查是否有任何元素在索引 0 和 2 处重复,然后在索引 1 和 3 处重复,我可以获得重复元素。
如果 n 是奇数,则有 2 个选择。
如果 (n+1)/2 个元素重复,那么我们可以只检查索引 0 和 2。例如说有 7 个元素,其中 4 个重复,那么重复元素必须在索引 0,2 ,4 和 6。
但是,当 n 为奇数时,我找不到找到 (n-1)/2 个重复元素的方法。我曾想过使用 xor 和 sum,但找不到方法。
【问题讨论】:
-
你可以只比较前5个吗?元素并在主题中找到重复项,它们不可能都不同。您甚至可以将它们放入 set 或其他东西中,因为这会使用额外的空间,但只有恒定的空间。
-
我对
(n-1)/2的所有奇怪输入持怀疑态度。如果n是 3,这将变为(3-1)/2 = 1,不会重复。所以,你需要从 5 开始。 -
如果是奇数,则重复 0 和 2 或 1 和 3。但是您总是可以从前 3 个或后 3 个元素中得出重复数字。 F.e.
(0,1,0, 2,0,3,0)(1,0,2, 0,3,0,4) -
@msdev:这个答案对你有帮助吗?
-
@ShridharRKulkarni cmets 帮助了我更多,但我确实通过您的回答了解了一种新算法。实际上,起初我很难意识到它与我的问题有何关系。感谢您的回答
标签: arrays algorithm math repeat