技术面试问题 - 我的方法是否正确?

时间:2009-11-30 09:50:15

标签: algorithm

最近我接受了一家软件公司的采访。我没有通过第一轮本身。

也许我在形成想法或解决问题方面太慢,对我采访的公司来说还不够好。 我想对我的采访有第二个意见,我找不到比这更好的人 stackoverflow社区。

所以这次采访是基本的一次

  1. 简介
  2. 你为何申请这个职位?
  3. 一个技术问题(详见下文)
  4. 您使用的最差软件是什么?为什么?改善
  5. 您使用过的最佳软件是什么?为什么要改进?
  6. 原始技术问题(由采访者提出)

    给定一个数字范围M ...... M + N-1我构造一个大小为N的数组,并用数字替换该数组中的一个元素。 你如何找到被替换的元素?

    我让他再次重复这个问题,因为我认为输入不足以解决问题。 他重复了声明ditto

    Q值。然后我问他是按照排序顺序从数字范围得到的数组吗? 采访者:没必要

    问我们在更换元素之前是否知道数组? 采访者:没有

    然后我开始写一些伪代码(同时做大声思考)。我立即意识到,如果原始数组有重复,它就无法工作。所以我有一段时间想着要怎么解决这个问题。然后我终于问了一些重要的问题

    问:如何选择Range中的元素来形成数组?
    采访者:我有一个数字范围M,M + 1,M + 2 ...... M + N-1。一个数字只被选中一次。我形成一个大小为N的数组。(这实际上意味着没有重复项,并且范围内的所有元素都被选中)

    问你用它取代的号码怎么样?它是否在同一范围内?
    采访者:是的。

    然后一切都变得清晰了

    这就是他的意思:
    问:我有一系列从M开始的数字,如M,M + 1,M + 2,M + 3 ...... M + N.我形成一个大小为N的数组,这样每个元素只被选中一次,原始数组没有任何重复。我用相同范围内的数字替换数组中的一个元素。找出我从该系列中挑选的内容进行更换?

    这相当于在数组中查找重复项。在替换后,将只有一对副本我们可以很容易地在O(N ^ 2)时间或O(nlogn)时间内找到它。我给了他两个算法。

    最后,我无法抗拒地问他“我是怎么在这个问题上表现的?他说你好好花了很多时间回答。

    显然他对我对这个问题的态度不满意 在回答这个问题时,您认为我应该做些什么?

5 个答案:

答案 0 :(得分:6)

如果我得到正确的问题,你可以在O(n)时间内解决这个问题。

  1. 使用大小为N的“hash”找到两个相同的元素
  2. 将其中一个元素设置为0。
  3. 从计算的总和中得出元素和减去的总和,你有缺失/替换的元素(元素的总和是(2M + N-1)*(N)/ 2
  4. 修改

    1. point的解释(使用大小为N的“hash”找到两个相同的元素)

    1. 如果您不知道M找到它(找到最小元素是O(n),只有一个循环)
    2. Alocate数组大小为N,并将元素设置为0(可以是BOOL类型)
    3. 走到桌子旁,在h
    4. 的适当位置检查1
    5. 如果是1那么你就有了colission,否则设置为1。
    6. 最后一部分的代码:

      for(i=0;i<N;i++)
      {
          if(h[a[i]-M] == 1) return i;
          h[a[i]-M] == 1;
      }
      

答案 1 :(得分:5)

这是一个经典的采访“谜语”。事实上,使用所描述的特技ralu在O(n)中很容易解决。

我们在数据结构1中教授的一件事是,当您的域有限时,可能会将其用于比O(nlogn)更好的函数[显然,在没有任何其他知识的情况下对域进行排序不可能是完成不到那个]。因此,当你知道自己的领域时 - 应该在你的脑海中打开一个小红灯泡:-)

我认为您应该立即指出有关重复的问题。它会清楚表明问题没有很好地形成。否则,他只是觉得你很慢(虽然这实际上是他的错......)。

我也认为问题4,5是个好问题。它们显示了申请人的经历以及申请人的想法。所以你可能因为你在那里说的话而未能通过面试。

答案 2 :(得分:3)

由于没有对允许使用的内存量指定限制,因此有一个O(N)解决方案:将大小为N的数组A初始化为全零。查看列表中的每个元素b并标记A [b - M] = 1.然后,如果A [c] == 0,则走A并返回c。

答案 3 :(得分:0)

这里的任何人都绝对不可能正确回答你的问题。你在事实后以明确的方式写下

  • 也许你在面试中絮絮叨叨,或者没有像这个问题那样表达自己的意思!
  • 也许你没有足够快地提出正确的问题
  • 也许你在获得指针后(或者没有你的竞争对手那么快)就没那么快了。
  • 也许面试官不喜欢你在思考问题之前开始编写代码的事实

我接受过无数次采访,我觉得我面试的人知道我要问的问题的答案。他们只是无法告诉我:他们的思想中充满了慌乱或混乱。有些人的思维过程明显地超出了他们的口,他们会混乱地跳起来。我会打赌他们中的一些人会离开并像你一样构建完美的答案......

我不能告诉你你是否做过这些事情;也许你的面试官是不合理的。我知道我接受的采访并不是那么好,因为我觉得这不是我自己的错。但此刻,我发现自己在思考:

  • 我可以把这个人放在用户面前吗?
  • 他是否足够快地加入了这个点?
  • 让他们在没有考虑的情况下直接进入?
  • 他们与我一小时前看到的人相比如何?

答案 4 :(得分:0)

O(nlogn)解决方案使用B树:..

假设我们构造一个二叉树,因为阵列也是......因为构造一个bin树的复杂性是O(n)。 另一个假设是任何等于或等于的元素都放在二叉树的左边。

这里我们检查数组中每个元素的左边节点是否与每个子树的父节点相同。遍历树需要O(logn)的时间。 我们试图找到n个元素中的每个元素的副本。因此总体时间是O(nlogn)。

使用B树和递归的O(n)解决方案:

我们可以构建如上所述的btree并使用相同的假设。 检查每个左孩子是否与父母一样。 对两个孩子都这样做。 递归的停止条件是child是否为NULL。 因此,每个节点都被检查一次。所以总的时间是O(n)。