无意间在网上看到了一个面试题是,写出一个回形矩阵。实现的效果大致如下:
[ 1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
因为日常都是使用Python,刚开始觉得使用list的append方法就可以做出来,动手一下发现还是不行的。后来,觉得应该先根据参数容量制作一个list,用list的替换方法来做替换。处理的过程中,还是发现有很多思维断掉的地方。
最后,在别人的博客上看到2004年,有人用Python实现了逆时钟方向的回形矩阵。借鉴了一下他的方法。大致的思路是这样的:
第0步:回形矩阵的特点是什么?
顺时钟回形矩阵,在等差值为1的情况下,按照一个回形为一层的情况来看:
推导的前三条矩阵边上的 “结束值” - “起始值” = “矩阵边长”-1,第四条矩阵边的 "结束值" 为 该层的起始值。
[ 1, 2, 3, 4, 5]
[16, , , , 6]
[15, , , , 7]
[14, , , , 8]
[13,12,11,10,9]
第一步,根据设定的矩阵边长,生成一个二维数组(C语言中这么描述,Python就是list里面嵌套list)
1 for i in range(size): 2 arry.append(range(size))
第二步,按照矩阵边长生成该层的数据池:
1 while size >0 : 2 create pool() 3 layer += 1 4 size -= 2
最终代码:
1 #!/usr/bin/env python 2 # coding: utf-8 3 4 5 def draw_matrix(begin, size, layer, arry, controlle_num): 6 # 以顺时钟方向建立递增矩阵,按照层级 7 # 根据递增1的特点,建立当前层的上下左右,四个list,形成资源池 8 # 每个方向list的长度都等于size的长度 9 # [1,2,3] 10 # [8, ,4] 11 # [7,6,5] 12 top = range(begin, begin+size) 13 right = range(begin+size-1, begin+size*2-1) 14 bottom = range(begin+size*2-2, begin+size*3-2) 15 left = range(begin+size*3-3, begin+size*4-3) 16 left[size-1] = begin # 顺时钟的左list最后一个值改为起始值 17 18 # size相当矩阵的边长,i既可以表示长,也可以表示宽 19 # 通过i步进来从本层的资源池里面取得各个值 20 for i in range(size): 21 arry[layer][layer+i] = top[i] 22 arry[layer+i][controlle_num-layer-1] = right[i] 23 arry[controlle_num-layer-1][controlle_num-layer-i-1] = bottom[i] 24 arry[controlle_num-1-layer-i][layer] = left[i] 25 return arry 26 27 28 def Matrix(size, begin=1, layer=0): 29 controlle_num = size 30 arry = [] 31 for i in range(size): 32 arry.append(range(size)) 33 while size > 0: 34 arry = draw_matrix(begin, size, layer, arry, controlle_num) 35 begin = begin+(4*(size-1)) 36 size = size - 2 37 layer = layer + 1 38 return arry 39 40 41 if __name__ == ‘__main__‘: 42 dat = Matrix(5) 43 for i in range(5): 44 print dat[i]
时间: 2024-10-29 19:11:54