从一个包含1000个元素的数组中生成一个新元素。

6
我在面试中被问到了这个问题。考虑打孔卡片的情况,每个打孔卡都有64位模式。我建议将每个卡片视为一个int,因为每个int是一组位。
此外,需要考虑到我已经有一个包含1000张这样的卡片的数组。我必须每次生成一个新元素,该元素与之前的1000张卡片不同。数组中的整数(也称为卡片)不一定按顺序排列。
更重要的是,如果问题是针对C++的,那么64位int从哪里来,以及如何从数组中生成这张新卡片,使其与数组中已有的所有元素都不同呢?

也许我误解了。每个新生成的数字都必须与所有以前的数字不同吗?还是每次都删除第一个元素?如果是这样,那么可以轻松地制定一个O(1000) = O(1)的解决方案。 - Fred Foo
@larsmans:要求新生成的整数与之前所有的整数都不同。 - Cipher
13个回答

0

基于这里的解决方案:关于数组和数字的问题

由于有1000个数字,如果我们考虑它们除以1001的余数,至少会缺失一个余数。我们可以选择那个作为我们缺失的数字。

因此,我们维护一个计数数组:C [1001],它将在C [r]中维护具有余数r(除以1001)的整数数量。

我们还维护一组数字,其中C [j]为0(使用链接列表表示)。

当我们移动窗口时,我们减少第一个元素的计数(假设余数为i),即减少C [i]。如果C [i]变为零,则将i添加到数字集合中。我们使用新添加的数字更新C数组。

如果我们需要一个数字,我们只需从C [j]为0的数字集合中随机选择一个元素。

这对于新数字是O(1),最初为O(n)。

这与其他解决方案类似,但并不完全相同。


0

这样简单的方法如何:

1)将数组分成小于或等于1000和大于1000的数字。

2)如果所有数字都适合较低的分区,则选择1001(或任何大于1000的数字),我们就完成了。

3)否则,我们知道必须存在一个介于1和1000之间的数字,该数字不存在于较低的分区中。

4)创建一个1000个元素的布尔数组,或者一个1000个元素长的位域,或者其他什么东西,并将数组初始化为所有0。

5)对于较低分区中的每个整数,使用其值作为数组/位域的索引,并将相应的布尔值设置为true(即进行基数排序)。

6)遍历数组/位域并选择任何未设置值的索引作为解决方案。

这在O(n)时间内运行,或者由于我们将所有内容限制在1000以内,因此从技术上讲,它是O(1),但通常情况下是O(n)时间和空间。有三次数据传递,这不一定是最优雅的方法,但复杂度保持为O(n)。


-1

你可以创建一个新数组,其中包含原始数组中不存在的数字,然后从这个新数组中选择一个。

这是O(1)吗?


1
是的,从微不足道的意义上讲,O(2^64) = O(1)。 - Fred Foo
你只需要创建一个数组,然后根据需要使用多次,如果每次选择一个数字后删除它。 而且只有1000张卡片,虽然很多,但只有1000张。 - Anonimo
忘了,我认为这1000张卡片是预先确定的。抱歉。 - Anonimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接