倒叙函数reverse()注意只是操作而已,返回none
本来想把if-else写成一行,结果出错不知道为啥
class Solution(object):
def flipAndInvertImage(self, A):
"""
:type A: List[List[int]]
:rtype: List[List[int]]
"""
for i,row in enumerate(A):
row.reverse()
for j,col in enumerate(row):
if col==1:
A[i][j] = 0
else:
A[i][j] = 1
return A
81ms
居然因为case太少所以没有百分比系数
-----------------------
考虑了半天的与或者是亦或之类的逻辑用语直接把值给算出来而不是用if-else
看了人家写的真是妙啊。。1-A 就解决了,不过亦或确实可行A^1即可
而且还有一种倒着循环的方法
list的遍历还是不够熟练
list[a:b:c] a表示开始的index,不包含index为b的元素结束(正序遍历则是b的前一个,倒序则是b的后一个停止),c为遍历方向(正为正序,负为倒序)以及步长(绝对值大小)
比如a = [0,1,2,3,4,5]
则a[3::-1] 为[3,2,1,0]
a[:3:-1] 为[5,4]
a[:2::-2]为[5,3]
class Solution(object):
def flipAndInvertImage(self, A):
"""
:type A: List[List[int]]
:rtype: List[List[int]]
"""
return [[1-i for i in row[::-1]]for row in A]
76ms
-------------------------------
真正的算法
- 首先学习运算符~和^
~为按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1
例如a = (0011 1100)二进制 = (60)十进制
~a = (1100 0011)二进制 = (-61)十进制 在一个有符号二进制数的补码形式
row[~i] = row[-i-1] = row[len(row) - 1 - i]就能倒着遍历
^为按位异或运算符:当两对应的二进位相异时,结果为1
- 其次了解一下xrange和range
range返回列表,xrange返回生成器。除了这点差别其他无差异。要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。除非真的要生成一个list,否则在循环里用的时候都用xrange比较好。
最后了解一下算法
其实就是前后两个方向一起遍历,第一位的最后结果是最后一位的亦或;而最后一位最后的结果则是第一位的亦或。
这样loop的时候节省一半时间。
class Solution(object):
def flipAndInvertImage(self, A):
"""
:type A: List[List[int]]
:rtype: List[List[int]]
"""
for row in A:
for i in xrange((len(row)+1)/2):
row[i],row[~i] = row[~i]^1,row[i]^1
return A
59ms 时间复杂度为N,其中N为A中所有元素的个数 空间复杂度为1