【问题标题】:Traverse 2D Array in Spiral pattern using recursion使用递归以螺旋模式遍历二维数组
【发布时间】:2010-12-11 23:00:01
【问题描述】:

我正在准备面试,并且已经被这个问题困扰了很长一段时间了。有人可以帮我写代码吗?如果不完整那么可能是sn-p的吗? 请..

【问题讨论】:

    标签: arrays recursion 2d spiral


    【解决方案1】:

    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]
    

    那么这里会发生什么? clockwise 的参数是一个二维数组 r。我们想从左到右顺时针打印它的内容。所以如果二维数组不为空,那么我们可以打印它的第一个元素,也就是顶行。接下来,我们要打印剩余行的最后一个元素(右侧的数字)。我们不想重复自己。所以我们要做的是转换剩余的行,以便下一个要打印的数字位于顶行。我们通过转置剩余的行(使它们成为列)然后反转它们来做到这一点。

    如果我用 Haskell 编写算法,也许算法会变得更清晰:

    import Data.List
    
    clockwise :: [[a]] -> [a] 
    clockwise (x:xs) = x ++ (clockwise $ reverse $ transpose $ xs) 
    clockwise _      = []
    

    【讨论】:

    • 肯定是个好答案!但我对使用的方法和算法更感兴趣。请帮忙。
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多