顺时针打印矩阵 && 翻转单词顺序列
最近两天老是在纠结那个树状数组问题,没来得及刷其他的题目,赶紧把之前还没解决的问题找出来刷一刷压压惊。
NO1:
#Problem Description: #输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 # 5 6 7 8 # 9 10 11 12 # 13 14 15 16 #则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. #
按照大神们的思路,首先输出第一行,然后逆时针旋转矩阵,将列从右往左转置到行,再输出,看下代码:
class Solution: def printMatrix(self, matrix): result = [] while (matrix): result+=matrix.pop(0) if not matrix or not matrix[0]: break matrix = self.reverseMatrix(matrix) return result def reverseMatrix(self,matrix): r = len(matrix) c = len(matrix[0]) rmatrix = [] for i in range(c)[::-1]: newmat = [] for j in range(r): newmat.append(matrix[j][i]) rmatrix.append(newmat) return rmatrix
其中先循环列,采用倒序:range(c)[::-1],再循环行,剩下就是递归和输出问题了,较为简单,顺利通过。
突然查看到一位大神的代码被惊艳到了,先来看看:
class Solution2: # matrix类型为二维列表,需要返回列表 def printMatrix(self, matrix): return matrix and list(matrix.pop(0)) + self.printMatrix(zip(*matrix)[::-1])
没错,一行代码,其中有两个地方有点难理解,第一个是return a and b,意思就是如果a为true,则输出b,反之为false,则输出b。后面的部分zip函数就是矩阵的转置,然后
交换上下行。
如此看来用python写程序真是很简洁,但是可读性就有点打折扣了,还是不推荐这种写法。
NO2:
#题目描述 #牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。 #同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。 #例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了, #正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行, #你能帮助他么?
感觉还是简单的翻转题目,直接用split函数,测试用例还加了空字符验证,所以再加个判断,感觉这样好像失去做这题的意义了
def ReverseSentence(self, s): slist = s.split() cstr = "" for i in range(len(slist)-1,-1,-1): cstr = cstr + slist[i]+" " if cstr.strip!="": return cstr.strip() else: return s
不过同样又看到了一个python大神的代码被吓到,同上
class Solution2: def ReverseSentence(self, s): return " ".join(s.split()[::-1]) if s.strip() != "" else s
也是一行。