【问题标题】:Tech Interview Question-Is my approach correct?技术面试问题——我的方法正确吗?
【发布时间】:2009-11-30 09:50:14
【问题描述】:

最近我接受了一家软件公司的面试。我没有通过第一轮。

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

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

  1. 简介
  2. 您为什么申请这个职位?
  3. 一个技术问题(详情如下)
  4. 你用过的最差的软件是什么?为什么?改进
  5. 你用过的最好的软件是什么?为什么要改进?

原始技术问题(根据面试官的要求)

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

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

问。然后我问他你从数字范围内得到的数组是不是排序的?
面试官:没必要

Q 在替换元素之前我们知道数组吗?
面试官:没有

然后我开始编写一些伪代码(一边大声思考)。我立即意识到,如果原始数组有重复,它将无法工作。所以我愣了一会儿,想怎么解决这个问题。最后我问了一些重要的问题

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

Q 那你替换它的号码呢?是否在同一范围内?
采访者:是的。

然后一切都变得清晰

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

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

最后我忍不住问他“我在那个问题上表现如何?他说嗯,你花了很多时间回答。

显然他对我对这个问题的处理方式不满意。
你认为我在回答这个问题时应该做些什么不同的事情?

【问题讨论】:

  • 您可能应该将此标记为社区 wiki,因为它是一个相当主观的主题。
  • 您可能答对了,但也有可能其他候选人也答对了。此外,选择不仅仅基于技术答案,而且个性对团队经理很重要 - 你真的无法知道团队经理在想什么或他想要什么。在很多方面,工作面试就像相亲。你遇到了那个人,那么无论你们中的一个人是否被另一个人强烈吸引,你都不能让另一个人想成为你的伴侣。
  • 是的,我知道选择过程并不完全基于回答技术问题。我更感兴趣的是如何更有效地处理这个问题?就像我应该提前说的那样,考虑到当前的输入,这个问题是无法解决的。
  • 事后看来,我认为您可以事先询问您对问题的理解是否正确。 “一个数字”和“构造一个数组”是模棱两可的:在给定一系列值的情况下,没有一种单一的方法可以“构造一个数组”,“一个数字”是什么意思?圆周率? -1 的平方根?需求收集是面试时测试的一个合理的事情,虽然我不知道这是否是面试官的意图,或者他是否认为你会理解“construct”基本上意味着“shuffle”而“a number”意味着“one数组中的其他个值”。
  • 如果范围是 [M, M+N],你需要一个 N+1 大小的数组。您似乎将范围 [M, M+N) 设为了一部分,然后在结论中恢复为 [M, M+N]。

标签: algorithm


【解决方案1】:

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

  1. 使用大小为 N 的“散列”找到两个相同的元素
  2. 将此元素之一设置为 0。
  3. 计算元素的总和并从计算的总和中减去,你有丢失/替换的元素(元素总和为 (2M+N-1)*(N)/2

编辑:

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

  1. 如果你不知道 M 找到它(找到最小的元素是 O(n) ,只有一个循环)
  2. 分配大小为 N 的数组 h 并将元素设置为 0(可以是 BOOL 类型)
  3. 去槽表并检查 1 在适当的位置关闭 h
  4. 如果为 1 则表示发生碰撞,否则设置为 1。

最后一部分代码:

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

【讨论】:

  • 你能详细说明(1)吗?
  • 3 + 4 + 5 == 12 != (3 + 3) * 3 /2
  • @Rulu 你能详细说明第3点吗?如果我理解正确,那么根据公式取元素总和与预期总和之间的差异只会给出原始之间的差异元素和它被替换的元素。例如,如果数字是 3,4,5,6,7(总和为 25),假设我将 6 替换为 4,则新数组为 3,4,5,4,7(总和为 23)。差异 2 不是我们要寻找的答案。
  • 但是你知道 4 是重复的,所以不同的是,2 + 4(重复)给你被替换的 6。如果将 6 替换为 7,推理是相似的。
  • 好吧,它是一个“频率”向量。我也在考虑相同的思路,但使用位图来节省空间(n * 4 字节与 n / 8 字节)。事实上,如果你使用它,你甚至不需要步骤 2 和 3,因为唯一未设置的值是被替换的值
【解决方案2】:

这是一个经典的采访“谜语”。事实上,使用 ralu 描述的技巧在 O(n) 内求解非常容易。

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

我认为您应该立即指出有关重复项的问题。这将清楚地表明这个问题没有很好地形成。不然他只是觉得你慢(虽然其实是他的错……)。

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

【讨论】:

  • 我可能会失败。我根本无法在脑海中保留一千个最好的和最差的前 5 名的清单。问我我最不喜欢的食谱是什么,以及我会做些什么来改进它。我不知道,但我不确定这能告诉你我在烹饪方面有多好。再说一次,当被问到一个主观问题或说“我不知道最坏的情况,但这很糟糕”时,没有规则禁止撒谎;-)
  • 我认为“相当糟糕”可能已经足够好了 :) 坦率地说,我也不确定我会如何回答,但之后的讨论才是最重要的!
  • @Anna 这次面试在我的大学校园里进行,每次面试有 30 分钟的时间段。当我到达中心时,面试官已经迟到了,在我的整个面试过程中,他一直在看手表。所以我们不能很好地讨论 Q4 和 5,他非常热衷于说出来。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这里的任何人都绝对不可能正确回答您的问题。 事后你写的很清楚。

    • 也许你在面试中语无伦次,或者没有像这个问题那样清楚地表达自己!
    • 也许您没有足够快地提出正确的问题
    • 也许你在得到指示后没有那么快(或者没有你的竞争对手那么快)
    • 也许面试官不喜欢你在思考问题之前就开始编写代码

    我进行过无数次采访,我觉得我正在采访的人知道我所问问题的答案。他们只是无法告诉我:他们的思维混乱或混乱。有些人的思维过程显然在他们的嘴巴之前,他们混乱地跳来跳去。我敢打赌他们中的一些人会走开并像你一样构建完美的答案......

    我不能告诉你这些事情是不是你做的;也许你的面试官不讲理。我知道我的面试并不顺利,因为我觉得这不是我自己的错。但此刻,我发现自己在想这样的事情:

    • 我可以把这个人放在用户面前吗?
    • 他加入这个点的速度够快吗?
    • 他们是不是想都没想就直接闯进去了?
    • 他们与我一小时前看到的人相比如何?

    【讨论】:

      【解决方案5】:

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

      假设我们构造了一个二叉树,因为数组也是如此......因为构造一个 bin 树的复杂度是 O(n)。 另一个假设是任何小于等于的元素都放在二叉树的左边。

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

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

      我们可以像上面提到的那样构建一个 btree,并使用相同的假设。 检查每个 left child 是否与 parent 相同。 对两个孩子做同样的事情。 递归的停止条件是 child 是否为 NULL。 因此,每个节点都检查一次。所以总耗时是O(n)。

      【讨论】:

      • B 树还是二叉树?
      猜你喜欢
      • 2023-03-14
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多