关于数组和数字的问题

时间:2010-06-17 10:16:10

标签: algorithm

我有一个问题  例如我们有数组

int a[]=new int[]{a1,a2,a3,a4,..........an}:

任务是由不在数组中的元素填充相同的数组 例如 a={1,3,4,5,6,7}应该由任何数字{2,8,9,12,13,90}或其他数字填充,但不能由数组中的元素填充,但这不能是{1,12,13,14,110},因为1在数组中 感谢

2 个答案:

答案 0 :(得分:2)

有趣的问题。

如果数组是有符号整数,我认为有可能在O(n)时间和O(1)空间中没有溢出,假设长度足够小以允许发生这种情况。

基本思路如下:

我们有n个号码。现在将这些数字除以n + 1,我们得到n个余数。因此,{0,1,2,...,n}中至少有一个剩余部分必须丢失(比方说r)。我们用数字填充数组,其余数为r。

首先,我们在所有负数中加上n + 1的倍数,使其为正数。

接下来,我们遍历数组并找到每个数字的余数,其中n + 1。如果余数是r,如果[r]为正,我们将[r]设置为-a [r]。 (如果我们在走路时遇到负数,我们在取余数时使用否定版本。)

对于余数= n,我们还有一个额外的int。

最后,我们再次遍历数组以查看是否有正数(将有一个,或者余数= n的额外int将被取消)。

一旦我们得到余数,就很容易用剩下的数字生成n个数字。当然,我们总是可以只生成一个数字并用它填充,因为问题从未说明任何关于唯一数字的信息。

如果数组是无符号整数,我们可能仍然可以通过更好的簿记来实现这一点。

<击> 例如,我们可以尝试使用前n / logn整数作为我们的bitarray来表示已经看到哪些剩余部分并使用一些额外的O(1)整数暂时保存数字。

例如,你执行tmp = a [0],找到余数并设置[0]的相应位(在先将其设置为零之后)。 tmp = a [1],设置位等。在我们需要它来找到它的余数之前,我们永远不会覆盖一个数字。

答案 1 :(得分:0)

只需获取数组中的最高和最低数字,创建一个包含从下限值到n的元素的新数组。

获得最高和最低数字可以在同一个循环中完成。

假设12,4,3,5,7,8,89,它将检测到3为最低值,89为最高值。然后它创建一个新的数组并用3..89填充它;然后丢弃旧阵列。