面试 - 编写程序以删除偶数元素

Dee*_*ons 5 c# algorithm search

我今天被问到了这个问题,我知道答案很简单,但他让我一直到最后.

编写程序以删除存储在ArrayList包含中的偶数1 - 100.

我只是说哇

在这里,你这就是我实现它的方式.

ArrayList source = new ArrayList(100);
for (int i = 1; i < 100; i++)
{
    source.Add(i);
}


for (int i = 0; i < source.Count; i++)
{
    if (Convert.ToInt32(source[i]) % 2 ==0)
    {
        source.RemoveAt(i);
    }
}

//source contains only Odd elements
Run Code Online (Sandbox Code Playgroud)

扭曲

他问我计算复杂性是什么给他一个等式.我刚刚说过,这是线性与N(输入)成正比.

他说:嗯...这意味着我需要等待更长时间才能获得结果,当输入大小增加时,我是对的吗? Yes sirr you are

为我调整,Log(N)尽可能多地尝试.我在这部分失败了.

  • 因此,来这里是为了正确的逻辑,答案或算法来做到这一点.

注意:他不想要Linq,没有额外的花里胡哨.只是简单的循环或其他逻辑来做到这一点

Tud*_*dor 5

我敢说复杂性实际上是O(N ^ 2),因为数组中的删除是O(N),并且可以为每个项目调用它.

所以你有O(N)遍历数组(列表)和O(N)每次删除=> O(N)*O(N).

由于它似乎不清楚,我将解释推理.在每个步骤中,可以移除物品(假设必须移除每个物品的最坏情况).在阵列中,移除是通过移位完成的.因此,要删除第一个项目,我需要将所有以下N-1项目向左移动一个位置:

1 2 3 4 5 6...
<---
2 3 4 5 6...
Run Code Online (Sandbox Code Playgroud)

现在,在每次迭代中我需要移位,所以我正在进行N-1 + N-2 + ... + 1 + 0移位,这给出了(N) * (N-1) / 2(算术系列)的结果,给出了O(N ^ 2)的最终复杂度.

  • @Deeptechtons.请参阅ArrayList.RemoteAt()的文档.它被记录为O(n):http://msdn.microsoft.com/en-us/library/system.collections.arraylist.removeat.aspx (5认同)
  • 跟踪要插入下一个值的索引.遍历数组.如果遇到偶数,请在索引处写入并增加索引.如果你遇到一个奇数,什么都不做.你经历过一次,你将每个偶数移动零次或一次,你根本不移动奇数.那是O(N) - 当然,这不是问题中要求的O(log N). (4认同)
  • @Deeptechtons:您认为这个"按索引删除"的确如何?通过转移.假设我要删除第3项.然后每个第4,第5 ......第N项需要向左移动1个位置. (3认同)
  • 我没有投票给你,我也不喜欢downvoting.但是如你所说的那样,通过索引去除因此总是1而不是O(N) (2认同)

Dan*_*e B 4

让我们这样想:

您正在执行的删除操作的数量强制为数组长度的一半(如果元素存储在数组中)。所以复杂度至少是 O(N) 。

您收到的问题让我假设您的教授希望您推理存储数字的不同方式。

通常,当您具有日志复杂性时,您会使用不同的结构,例如图形或树。

我能想到的对数复杂度的唯一方法是将数字存储在树中(有序树,b树......我们可以对此进行详细说明),但它实际上超出了考试的限制(将数字存储在大批)。

这对你来说有意义吗?