本题要求顺时针输出一个数组,同样出现在了剑指 offer 中(面试题29),解决思路较为简单,但是需要思考大量的临界值问题,通过画图后可以快速的理清思路,show you the code:
#把一个数组顺序输出
class Solution(object):
def spiralPrint(self, matrix, start):
#输出这一圈
result = []
i = start
while i < len(matrix[0]) - start:
result.append(matrix[start][i])
i += 1
j = start
while j < len(matrix) - start:
if j == start:
j += 1
continue
result.append(matrix[j][i - 1])
j += 1
k = i - 1
while j - 1 > start and k >= start:
if k == i - 1:
k -= 1
continue
result.append(matrix[j - 1][k])
k -= 1
l = j - 1
while j - 2 > start and i - 1 > start and l > start:
if l == j - 1:
l -= 1
continue
result.append(matrix[l][start])
l -= 1
return result
def spiralOrder(self, matrix):
start = 0
result = []
if len(matrix) == 0:
return result
while 2 * start < len(matrix) and 2 * start < len(matrix[0]):
#确定是否还有没有输出的地方
result.extend(self.spiralPrint(matrix, start))
start += 1
return result
A = Solution()
m = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
print(A.spiralOrder(m))