54. 螺旋矩阵

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)

   转载规则


《54. 螺旋矩阵》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
394. 字符串解码 394. 字符串解码
394. 字符串解码方法1:利用栈先进后出原则(模拟递归) digit = [] ###存放数字 letter = [] ###存放数字前面的字母串 res = ‘’ ###解码结果。在遍历过程中,也会临时存放字母串 遇到左
2020-08-20
下一篇 
牛客网编程常见输入输出练习 牛客网编程常见输入输出练习
OJ在线编程常见输入输出练习场题目链接 python:各种字符输入、数值输入总结、OJ输入输出 python可以用下面的函数处理输入 n=int(input().strip()) res=list(map(str,input().st
2020-08-19
  目录