刷到了一道笔试题,与小伙伴们共享之。
输入:矩阵维度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]]