我正在准备面试,并且已经在这个问题上停留了很长时间。有人可以帮我写代码吗?如果不完整那么可能是一个片段吗?请..
问问题
3355 次
1 回答
20
Python 2,按顺时针方向打印一个二维嵌套列表,从左上角到中心:
>>> def clockwise(r):
... return list(r[0]) + clockwise(list(reversed(zip(*r[1:])))) if r else []
...
>>> a = [
... [ 1, 2, 3],
... [ 5, 6, 7],
... [ 9, 10, 11]]
>>> clockwise(a)
[1, 2, 3, 7, 11, 10, 9, 5, 6]
>>> a = [
... [ 1, 2, 3, 4],
... [ 5, 6, 7, 8],
... [ 9, 10, 11, 12],
... [13, 14, 15, 16]]
>>> clockwise(a)
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
那么这里会发生什么?to 的参数clockwise
是一个二维数组r
。我们想从左到右顺时针打印它的内容。所以如果二维数组不为空,那么我们可以打印它的第一个元素,也就是顶行。接下来,我们要打印剩余行的最后一个元素(右侧的数字)。我们不想重复自己。所以我们要做的是转换剩余的行,以便下一个要打印的数字位于顶行。我们通过转置剩余的行(使它们成为列)然后反转它们来做到这一点。
如果我用 Haskell 编写算法,也许算法会变得更清晰:
import Data.List
clockwise :: [[a]] -> [a]
clockwise (x:xs) = x ++ (clockwise $ reverse $ transpose $ xs)
clockwise _ = []
于 2009-10-31T21:46:13.003 回答