微软技术专访:Matrix Algorithm

时间:2018-05-14 20:24:54

标签: algorithm matrix pseudocode

我最近接受了一次采访,面试官给了我一些假代码并询问了与之相关的问题。不幸的是,由于缺乏准备,我无法回答他的问题。由于时间限制,我不能问他解决这个问题的方法。如果有人能指导我并帮助我理解这个问题,我真的很感激,所以我可以为未来做好准备。下面是伪代码:

A sample state of ‘a’: 
[[   2, NULL,    2, NULL], 
 [   2, NULL,    2, NULL], 
 [NULL, NULL, NULL, NULL], 
 [NULL, NULL, NULL, NULL]]

FUNCTION foo()
  FOR y = 0 to 3 
    FOR x = 0 to 3
      IF a[x+1][y] != NULL
        IF a[x+1][y] = a[x][y]:
          a[x][y] := a[x][y]*2
          a[x+1][y] := NULL
        END IF
        IF a[x][y] = NULL
          a[x][y] := a[x+1][y]
          a[x+1][y] := NULL
        END IF
      END IF
    END FOR
  END FOR
END FUNCTION

面试官问我:

  1. 上述代码有什么问题,如何解决?

  2. 一旦纠正,foo的功能是什么?请关注功能的结果,而不是实施的细节。

  3. 你怎么能让foo变得更通用?解释最多三个可能的概括方向并描述每个方案的策略,无需编写代码!

  4. 我向他提到过:

    • 矩阵的状态看起来不正确,因为整数矩阵不能具有空值。默认情况下,他们会为布尔分配0false,为参考类型分配null
    • 上述代码的另一个问题是IF a[x+1][y] != NULL,当x等于3时,该条件将产生数组索引越界错误。

    但是我觉得面试官在我的回答中寻找其他的东西并且对解释不满意。

3 个答案:

答案 0 :(得分:7)

你玩过游戏" 2048" (link to game)?如果没有,这个问题可能对你没那么直观,因此,我认为这是一个糟糕的面试问题。

这试图做的是模拟2048游戏的一个步骤,其中数字向上。数字将向上移动一个单元格,除非它们碰到另一个数字或矩阵边界(想象重力将所有数字向上拉)。如果两个数字相等,它们会合并并产生一个新数字(它们的总和)。

注意:这并不是2048游戏的一个步骤,因为数字只会向上移动一个单元格,而在游戏中它们会一直向前移动#34;直到他们碰到其他东西。要获得2048游戏的一个步骤,您将重复给定的功能,直到不再发生更改。

正如您所提到的,代码中的问题是数组索引越界。应该通过迭代x = 0 to 2来修复它。

为了使这更加通用,你必须具有创造性:

  1. 主要的概括是它应该采取一个方向"参数。 (如果你没有自己玩过2048游戏,你也不会知道这一点。)重力可以在4个基本方向中的任意一个方向上拉动数字,而不是重力向上拉数字。
  2. 也许算法不应检查NULL,但应检查其他一些标记值(这是另一个输入)。
  3. 将此概括为更大的矩阵也很容易。
  4. 也许应该有一些其他的规则决定数字何时合并,以及它们组合的精确程度(不一定是第一次的2倍)。这些规则可以以lambdas的形式给出。
  5. 至于你回答的这一部分:

      

    整数矩阵不能有空值,默认情况下它们被赋值为0,false表示布尔值,null表示引用类型

    这在很大程度上取决于所使用的语言,因此我不会说这是伪代码中的错误(它不应该是任何特定语言)。例如,在弱类型语言中,您当然可以使用包含intNULL值的矩阵。

    你没有提到你对这部电影的行为所说的话。如果我是面试官,我会想看到有人"大声思考"并至少实现以下目标:

    • 代码试图将每个元素与下面的元素进行比较。
    • 除非下层元素为NULL,否则什么都不会发生。
    • 如果两个元素相等,则较低的元素将替换为NULL,而较高的元素将变为两倍。
    • 如果顶部元素为NULL,则较低的非NULL元素"移动"到顶部元素的地方。

    通过阅读源代码,可以直接获得有关代码的这些观察结果。你是否理解这些"规则"并注意到它(类似于)2048游戏在很大程度上取决于你之前是否玩过游戏。

答案 1 :(得分:0)

  

更正后,函数foo会做什么?请关注功能的结果,而不是实现的细节

输出将是:

4 null 4 null
null null null null
null null null null
null null null null

答案 2 :(得分:0)

这是同一程序的python代码。我已经修复了这段代码中索引超出范围的问题。希望这会有所帮助。

null = 0
array = [[2,null,2,null],[2,null,2,null],[null,null,null,null],[null,null,null,null]]
range = [0,1,2]
for y in range:
   for x in range:
       if array[x+1][y] != null:
           if array[x+1][y] == array[x][y]:
               array[x][y] = array[x][y]*2
               array[x+1][y] = null
           if array[x][y] == null:
               array[x][y] = array[x+1][y]
               array[x+1][y] = null
print(array)