無意間在網上看到了一個面試題是,寫出一個回形矩陣。實現的效果大致如下:
[ 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)
for i in range(size):
arry.append(range(size))
第二步,按照矩陣邊長生成該層的資料池:
while size >0 :
create pool()
layer += 1
size -= 2
最終程式碼:
#!/usr/bin/env python
# coding: utf-8 def draw_matrix(begin, size, layer, arry, controlle_num):
# 以順時鐘方向建立遞增矩陣,按照層級
# 根據遞增1的特點,建立當前層的上下左右,四個list,形成資源池
# 每個方向list的長度都等於size的長度
# [1,2,3]
# [8, ,4]
# [7,6,5]
top = range(begin, begin+size)
right = range(begin+size-1, begin+size*2-1)
bottom = range(begin+size*2-2, begin+size*3-2)
left = range(begin+size*3-3, begin+size*4-3)
left[size-1] = begin # 順時鐘的左list最後一個值改為起始值 # size相當矩陣的邊長,i既可以表示長,也可以表示寬
# 通過i步進來從本層的資源池裡面取得各個值
for i in range(size):
arry[layer][layer+i] = top[i]
arry[layer+i][controlle_num-layer-1] = right[i]
arry[controlle_num-layer-1][controlle_num-layer-i-1] = bottom[i]
arry[controlle_num-1-layer-i][layer] = left[i]
return arry def Matrix(size, begin=1, layer=0):
controlle_num = size
arry = []
for i in range(size):
arry.append(range(size))
while size > 0:
arry = draw_matrix(begin, size, layer, arry, controlle_num)
begin = begin+(4*(size-1))
size = size - 2
layer = layer + 1
return arry if __name__ == '__main__':
dat = Matrix(5)
for i in range(5):
print dat[i]