我最近接受了一次采访,面试官给了我一些假代码并询问了与之相关的问题。不幸的是,由于缺乏准备,我无法回答他的问题。由于时间限制,我不能问他解决这个问题的方法。如果有人能指导我并帮助我理解这个问题,我真的很感激,所以我可以为未来做好准备。下面是伪代码:
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
面试官问我:
上述代码有什么问题,如何解决?
一旦纠正,foo的功能是什么?请关注功能的结果,而不是实施的细节。
你怎么能让foo变得更通用?解释最多三个可能的概括方向并描述每个方案的策略,无需编写代码!
我向他提到过:
0
,false
,为参考类型分配null
。IF a[x+1][y] != NULL
,当x
等于3
时,该条件将产生数组索引越界错误。但是我觉得面试官在我的回答中寻找其他的东西并且对解释不满意。
答案 0 :(得分:7)
你玩过游戏" 2048" (link to game)?如果没有,这个问题可能对你没那么直观,因此,我认为这是一个糟糕的面试问题。
这试图做的是模拟2048游戏的一个步骤,其中数字向上。数字将向上移动一个单元格,除非它们碰到另一个数字或矩阵边界(想象重力将所有数字向上拉)。如果两个数字相等,它们会合并并产生一个新数字(它们的总和)。
注意:这并不是2048游戏的一个步骤,因为数字只会向上移动一个单元格,而在游戏中它们会一直向前移动#34;直到他们碰到其他东西。要获得2048游戏的一个步骤,您将重复给定的功能,直到不再发生更改。
正如您所提到的,代码中的问题是数组索引越界。应该通过迭代x = 0 to 2
来修复它。
为了使这更加通用,你必须具有创造性:
NULL
,但应检查其他一些标记值(这是另一个输入)。至于你回答的这一部分:
整数矩阵不能有空值,默认情况下它们被赋值为0,false表示布尔值,null表示引用类型
这在很大程度上取决于所使用的语言,因此我不会说这是伪代码中的错误(它不应该是任何特定语言)。例如,在弱类型语言中,您当然可以使用包含int
和NULL
值的矩阵。
你没有提到你对这部电影的行为所说的话。如果我是面试官,我会想看到有人"大声思考"并至少实现以下目标:
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)