zoukankan      html  css  js  c++  java
  • 大爽Python入门练习题 44 生成螺旋矩阵(二维列表)

    大爽Python入门练习题总目录

    第四章 中期练习题 冷酷&凶残 第4题

    题目

    出处: leetcode-54: Spiral Matrix
    原题是输出,这里是生成,其实核心逻辑是相通的。

    简介

    实现一个函数get_spiral_matrix(m, n):
    接受两个正整数mn作为参数(mn一定都大于0),
    返回mn列的矩阵(二维列表),
    矩阵的值为1到\(m \times n\)
    按螺旋顺序插入得到(详细解释见下方)。

    详细说明

    螺旋顺序如下图所示

    这是一个3行4列的效果

    这是一个6行5列的效果

    示例

    get_spiral_matrix(3, 4)的返回值为
    (下面手动为列表换行方便观察)

    [
        [1, 2, 3, 4],
        [10, 11, 12, 5],
        [9, 8, 7, 6]
    ]
    

    get_spiral_matrix(6, 5)的返回值为
    (下面手动为列表换行方便观察)

    [
        [1, 2, 3, 4, 5],
        [18, 19, 20, 21, 6],
        [17, 28, 29, 22, 7],
        [16, 27, 30, 23, 8],
        [15, 26, 25, 24, 9],
        [14, 13, 12, 11, 10]
    ]
    

    分割线

    本小段没有实际意义,
    仅用于分隔题目和答案。
    防止学生无意中直接看到答案,
    影响思路。



















    答案

    参考答案1

    def get_spiral_matrix(m, n):
        matrix = [
            [0 for ci in range(n)] for ri in range(m)
        ]
        min_v = m
        if n < m:
            min_v = n
    
        layer = (min_v + 1) // 2
        count = 0
        for li in range(layer):
            for ci in range(li, n-li):
                count += 1
                matrix[li][ci] = count
    
            for ri in range(li + 1, m-li-1):
                count += 1
                matrix[ri][n-li-1] = count
    
            if li < m-li-1:
                for ci in range(n-li-1, li-1, -1):
                    count += 1
                    matrix[m-li-1][ci] = count
    
            if li < n-li-1:
                for ri in range(m-li-2, li, -1):
                    count += 1
                    matrix[ri][li] = count
    
        return matrix
    

    参考答案2

    direction = [
        (1, 0),
        (0, 1),
        (-1, 0),
        (0, -1)
    ]
    
    
    def get_spiral_matrix(m, n):
        matrix = [
            [0 for ci in range(n)] for ri in range(m)
        ]
    
        ci, ri = -1, 0
        di = 0
        count = 0
    
        while count < m * n:
            dc, dr = direction[di]
            nc, nr = ci + dc, ri + dr
            if 0 <= nc < n and 0 <= nr < m:
                if matrix[nr][nc] == 0:
                    count += 1
                    matrix[nr][nc] = count
                    ci, ri = nc, nr
                    continue
    
            di += 1
            di %= 4
    
        return matrix
    
  • 相关阅读:
    算法提高 身份证号码升级
    枚举排列
    排列数
    算法训练 K好数
    算法训练 前缀表达式
    算法训练 区间k大数查询
    最大最小公倍数
    Anagrams问题
    Uiautomator 2.0
    Uiautomator 2.0
  • 原文地址:https://www.cnblogs.com/BigShuang/p/15664676.html
Copyright © 2011-2022 走看看