顺时针填充矩阵

刷到了一道笔试题,与小伙伴们共享之。

输入:矩阵维度M, N
输出:顺时针填充后的矩阵

示例:
输入:M=3 N=4
输出:
[ 1 2 3 4 10 11 12 5 9 8 7 6 ] M × N \left[ \begin{matrix} 1 & 2 & 3 & 4\\ 10 & 11 & 12 & 5\\ 9 & 8 & 7 & 6 \end{matrix} \right]_{M \times N} 110921183127456 M×N

代码:

import numpy as np
# 封装函数
# data = matrix_turn(M, N)
def matrix_turn(M, N):
    # 设置数据框
    data = []
    for i in range(M):
        data.append(list(np.zeros(N)))
    # 设置序列
    array = list(np.arange(M*N)+1)
    # 初始化参数
    m = 0
    n = 0
    bound = 0
    j = m
    k = n
    b = bound
    hori = []
    vert = []
    # 由外到内循环写入
    for i in range(len(array)):
        bnd_1 = N-b-1    # 水平边界
        bnd_2 = M-b-1    # 垂直边界
        if k <= bnd_1:
            # 向右
            k_right = k
            data[j][k_right] = array[i]
            hori.append(k_right)  # 记录水平刻度
            count_h = len(hori)
            k += 1
        elif j+1 < bnd_2:
            # 向下
            j_down = j+1
            data[j_down][bnd_1] = array[i]
            vert.append(j_down)   # 记录垂直刻度
            count_v = len(vert)
            j += 1
        elif count_h > 0:
            # 向左
            data[bnd_2][hori[count_h-1]] = array[i]  # 调用水平刻度
            count_h -= 1
        elif count_v > 0:
            # 向上
            data[vert[count_v-1]][b] = array[i]      # 调用垂直刻度
            count_v -= 1
            if count_v <= 0:
                # 更新参数
                b += 1
                m += 1
                n += 1
                j = m
                k = n
                hori = []
                vert = []
        # 终止条件
        if i == len(array)-1:
            break
    return data
# 测试函数
M = 3
N = 4
data = matrix_turn(M, N)
# data = [[1, 2, 3, 4], [10, 11, 12, 5], [9, 8, 7, 6]] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值