Algorithm 技术面试问题:我的方法正确吗?

Algorithm 技术面试问题:我的方法正确吗?,algorithm,Algorithm,最近我接受了一家软件公司的采访。我自己没有通过第一轮 也许我在形成想法或解决问题方面太慢,对我面试的公司来说不够好。 我想对我的面试有第二个意见,我找不到比这个更好的人了 stackoverflow社区 所以这次采访是一次基本的采访 导言 你为什么申请这个职位 一个技术问题(详情如下) 你用过的最差的软件是什么?为什么?改善 你用过的最好的软件是什么?为什么要改进 原始技术问题(由面试官提出) 给定一个数字范围M…..M+N-1,我构造一个大小为N的数组,并用一个数字替换该数组中的一个元素。 您

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

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

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

  • 导言
  • 你为什么申请这个职位
  • 一个技术问题(详情如下)
  • 你用过的最差的软件是什么?为什么?改善
  • 你用过的最好的软件是什么?为什么要改进
  • 原始技术问题(由面试官提出)

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

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

    问:然后我问他,你从数字范围中得到的数组是按顺序排列的吗?
    记者:没必要

    在替换元素之前,我们知道数组吗?
    记者:没有

    然后我开始写一些伪代码(一边大声思考)。我立即意识到,如果原始阵列中有重复项,它将无法工作。所以我有一段时间一直在思考如何解决这个问题。最后我问了一些重要的问题

    Q如何从范围中选择元素以形成阵列?
    采访者:我有一系列的数字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)时间内找到一对副本。我给了他两种算法

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

    显然,他不满意我对这个问题的态度。

    在回答这个问题时,您认为我应该采取什么不同的做法?

    如果我答对了问题,您可以在O(n)时间内解决这个问题

  • 使用大小为N的“哈希”查找两个相同的元素
  • 将其中一个元素设置为0
  • 对元素求和并从计算出的和中减去,就得到了缺少/替换的元素(元素和为(2M+N-1)*(N)/2)
  • 编辑:

    解释1.点(使用大小为N的“哈希”查找两个相同的元素)

  • 如果您不知道M,请找到它(找到最小的元素是O(n),只有一个循环)
  • 计算大小为N的数组h并将元素设置为0(可以是BOOL类型)
  • 通过工作台,在h的适当位置检查1
  • 如果它是1,那么你有共线,否则设置1
  • 最后一部分代码:

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

    for(i=0;i这是一个经典的面试“谜语”。事实上,使用ralu描述的技巧在O(n)中很容易解决

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

    我认为你应该立即指出关于复制品的问题。这会清楚地表明问题的形式不正确。否则,他只是认为你很慢(尽管事实上这是他的错…)


    我还认为问题4、5是很好的问题。它们显示了申请人的经验以及申请人的想法。因此,可能是因为你在面试中说了些什么而导致面试失败。

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

    这里的任何人都绝对不可能正确回答您的问题。您是在事后以清晰的方式写下这个问题的

    • 也许你在面试中漫无边际,或者没有像这个问题那样清晰地表达自己
    • 也许你没有足够快地提出正确的问题
    • 也许你在被指点后理解得不够快(或者不如你的竞争对手快)
    • 也许面试官不喜欢你在思考问题之前就开始编写代码
    我接受过无数次采访,我觉得我要采访的人知道我问的问题的答案。他们就是不能告诉我:他们的思维混乱或慌乱。有些人的思维过程明显超出了他们的口,他们困惑地跳来跳去。我敢打赌,他们中的一些人会走开,开始思考你的答案并不完美

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