lintcode入门篇六
185. 矩阵的之字型遍历
给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。
样例
样例 1:
输入: [[1]]
输出: [1]
样例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10, 11, 12]
]
输出: [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]
class Solution: ''' 1.首先i,j都不能小于0,并且i<len(matrix) and j<len(matrix[0]) 2.一开始是往上右,upright = True 3.如果是upright = True的话,下一个值就是i-1,j+1,否则i+1,j-1 4.如果i<0或者j<0,则代表需要转换方向,upright=False或者True: 如果转换方向,此时的upright =True的话,此时得分情况: (1).一种是j在范围内(即j<=len(matrix)-1,那么需要往右边走,j+1,i不变(此时不仅要回退到原来的i和j,而且j需要再加1) (2).一种是j出范围(即j==len(matrix)),那么需要往下走,i+1(此时不仅需要回退到原来的i和j,而且i需要再加1) 如果转换方向,此时的upright =True的话,此时得分情况: (1).和上述相反 (2).和上述相反 ''' def printZMatrix(self,matrix): upright = True res=[] i,j=0,0 IsOut = False while True: if upright == True: ##在此下运行的条件 while i>=0 and j>=0 and i <= len(matrix)-1 and j<=len(matrix[0])-1:
##终止条件 if i == len(matrix)-1 and j == len(matrix[0])-1: IsOut = True break res.append(matrix[i][j]) print('upright=True:'+str(res[-1])) i = i-1 j = j+1 else: if j == len(matrix[0]): i = i+2 j = j-1 else: i = i+1 upright = False print(upright) if upright == False: print('enter') while i>=0 and j>=0 and i <= len(matrix)-1 and j<=len(matrix[0])-1: if i == len(matrix)-1 and j == len(matrix[0])-1: IsOut = True break res.append(matrix[i][j]) i = i+1 j = j-1 print('upright=False:'+str(res[-1])) else: if (i == len(matrix)): i = i-1 j = j+2 else: j = j+1 upright = True if IsOut == True: res.append(matrix[-1][-1]) break return res
大致解释:(折腾了两小时,终于搞定,略显累赘)
1.写入的顺序是先往右上,在往左下,在往右上,在往左下,依次写入,直到i=len(matrix)-1 and j = len(matrix[0])-1。
2.如果upright=True的话,取下一个元素是i-1,j+1
upright=True的时候,如果i<0或者j>len(matrix)-1的时候,说明需要进行转换(即换方向)。
(1).i<0,此时需要往右边走,i和j需要回退到原来的值,并且j需要再加1.
(2).j>len(matrix)-1,此时需要往下走,i和j需要回退到原来的值,并且i需要在加1
如果upright=False,和上述情况相反。
204. 单例
单例 是最为最常见的设计模式之一。对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例。例如,对于 class Mouse (不是动物的mouse哦),我们应将其设计为 singleton 模式。
你的任务是设计一个 getInstance
方法,对于给定的类,每次调用 getInstance
时,都可得到同一个实例。
样例
在 Java 中:
A a = A.getInstance();
A b = A.getInstance();
a 应等于 b
挑战
如果并发的调用 getInstance,你的程序也可以正确的执行么?