題目:輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣:
最後的輸出是:
思路
第一眼看到首先想到的肯定是算法書上的一道類似的題目,通過4個for循環來進行遍歷。把每一圈都劃分爲一個子問題進行求解。但是問題是,如何確定每一個for循環的邊界?一旦邊界出現錯誤,就會有些數字沒有進行輸出,另一些數字反而重複輸出。
函數:
def output(self,result,matrix,n,size_one,size_two,count)
result是最後的輸出列表。matrix是二維數組。n表示第幾次調用這個函數,初始值是0。size_one表示本次調用的矩陣的行數。size_two表示本次調用的矩陣的列數。count表示最大需要調用多少次這個函數。
步驟
首先把最外圈首次調用函數看成n=0,也就是如圖:
第一行看成第一個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[0][0]到array[0][3]。其中最後一個輸出的列是n+size_two-1。這也就確定了第一個for循環是從array[n][n]到array[n][n+size_two-1]。代碼如下:
for i in range(0,size_two):
result.append(matrix[n][n+i])
接着把最外圈的最後一列看成第二個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[1][3]到array[3][3]。第一個輸出是array[n+1][n+size_two-1]到array[n+size_one-1][n+size_two-1]。代碼如下:
for i in range(n+1,n+size_one):
result.append(matrix[i][n+size_two-1])
接着把最外圈的最後一行看成第三個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[3][2]到array[3][0]。第一個輸出是array[n+size_one-1][n+size_two-2]到array[n+size_one-1][n]。代碼如下:
for i in range(2,size_two+1):
result.append(matrix[n+size_one-1][n+size_two-i])
接着把最外圈的第一列看成第四個for循環的輸出,此時是第一次遍歷,n=0,輸出的是array[2][0]到array[1][0]。第一個輸出是array[n+size_one-2][n]到array[n+1][n]。代碼如下:
for i in range(2,size_one):
result.append(matrix[n+size_one-i][n])
然後我們就得到了上圖中紅色部分的輸出。再調用一次這個函數,這個時候n=1。輸出圖中藍色部分。
這個時候調用函數時傳進去的參數是
output(result,matrix,n+1,size_one-2,size_two-2,count)
需要注意的是因爲每一次調用函數的輸出是一圈,所以最後剩下的矩陣的大小是行數減少2,列數減少2。
問題
這個代碼還有一個問題,就是如果輸出到最後只剩下一行,或者只剩下一列,那麼就會重複輸出,所以我們必須要對後兩個for循環進行約束,必須在行數和列數同時不爲1的時候才進行後面兩個for循環。
最後的函數代碼:
# -*- coding:utf-8 -*-
class Solution:
# matrix類型爲二維列表,需要返回列表
def printMatrix(self, matrix):
result = []
size_one = len(matrix)
size_two = len(matrix[0])
if size_one>size_two:
if size_two%2==1:
count = (size_two+1)/2
else:
count = size_two/2
else:
if size_one%2==1:
count = (size_one+1)/2
else:
count = size_one/2
self.output(result,matrix,0,size_one,size_two,count)
return result
def output(self,result,matrix,n,size_one,size_two,count):
for i in range(0,size_two):
result.append(matrix[n][n+i])
for i in range(n+1,n+size_one):
result.append(matrix[i][n+size_two-1])
if n!=n+size_two-1 and n!=n+size_one-1:
for i in range(2,size_two+1):
result.append(matrix[n+size_one-1][n+size_two-i])
for i in range(2,size_one): ##
result.append(matrix[n+size_one-i][n])
if n+1<count:
self.output(result,matrix,n+1,size_one-2,size_two-2,count)