54. 螺旋矩阵
顺时针打印矩阵
- 设定上下左右四个点
- 从左到右彻底遍历一行,然后上边界+1。若上边界超过下边界:跳出
- 从上到下彻底遍历一列,然后右边界-1。若左边界超过右边界:跳出
- 从右到左彻底遍历一行,然后下边界-1。若上边界超过下边界:跳出
- 从下到上彻底遍历一列,然后左边界+1。若左边界超过右边界:跳出
class Solution(object):
def spiralOrder(self, matrix):
if not matrix: return []
l = 0
r = len(matrix[0]) - 1
t = 0
b = len(matrix) - 1
res = []
while True:
# 从左到右
for i in range(l, r + 1): res.append(matrix[t][i])
t += 1
if t > b: break
# 从上到下
for i in range(t, b + 1):
res.append(matrix[i][r])
r -= 1
if l > r: break
# 从右到左
for i in range(r, l - 1, -1):
res.append(matrix[b][i])
b -= 1
if t > b: break
# 从下到上
for i in range(b, t - 1, -1):
res.append(matrix[i][l])
l += 1
if l > r: break
return res
还有种取巧的方法(仅供参考):
- 把第一行pop出来,加到结果中
- 把剩下的矩阵逆时针翻转90度,把第一行pop出来,加到结果中。直至结束
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
res=[]
while matrix:
res.extend(matrix.pop(0))
matrix=list(map(list,zip(*matrix)))[::-1]
print(res)
return res
2020.8.19 华为笔试题目1
- 同样是顺时针遍历数组,只是增加了一个判断个位十位的功能
# 判断个位十位的函数
def helper(n):
a = n % 10 # 个位
b = (n // 10) % 10 # 十位
return a == 7 and b % 2
def getRes(M,N):
# 超过范围,返回
if not (10 <= M <= 1000 and 10 <= N <= 1000):
print("[]")
return
idx = 0
res = []
l = 0
r = N - 1
t = 0
b = M - 1
while True:
# 从左到右
for i in range(l, r + 1):
idx += 1
if helper(idx):
res.append([t, i])
t += 1
if t > b: break
# 从上到下:
for i in range(t, b + 1):
idx += 1
if helper(idx):
res.append([i, r])
r -= 1
if l > r: break
# 从右到左
for i in range(r, l - 1, -1):
idx += 1
if helper(idx):
res.append([b, i])
b -= 1
if t > b: break
# 从下到上
for i in range(b, t - 1, -1):
idx += 1
if helper(idx):
res.append([i, l])
l += 1
if l > r: break
# print(res)
res = str(res).replace(" ", "")
print(res)
if __name__ == '__main__':
tmp=list(map(int,input().strip().split()))
M=tmp[0]
N=tmp[1]
getRes(M,N)