412. Fizz Buzz and 463. Island Perimeter

主要写写这两个问题在Solutions里的one line python的解法,题目本身都很容易。

  1. Fizz Buzz
def fizzBuzz(self, n):
    return ['Fizz' * (not i % 3) + 'Buzz' * (not i % 5) or str(i) for i in range(1, n+1)]

这个问题有两个特别的语法点,一个是or除了逻辑运算符的功能外,还有一个语义是返回第一个非空对象,第二个是字符串也可以用乘法(以前只知道加法。。。)

  1. Island Perimeter
def islandPerimeter(self, grid):
    return sum(sum(map(operator.ne, [0] + row, row + [0]))
               for row in grid + map(list, zip(*grid)))

这个onelinepython着实让我想了一阵子。。。。前一个不明白的点就是map(operator.ne, [0] + row, row + [0]),后来通过各种实验和打印数据,发现这句话就是让每个grid中的row去和自己的后一位(或者理解成前一位也没问题)去做异或,然后第一位和最后一位和0做异或,之后sum起来,就是边的长度了。

再有一个点是for row in grid + map(list, zip(grid),后面的map(list, zip(grid)我在查了zip的用法之后发现,这里就是把整个grid翻转map之后返回的就是个完全转秩的grid,然后这里for循环的row其实就是col了(当然前面的那个in grid中取得还是row)。

真的是,很简洁的写法,但是工程中(工作的时候)我是绝对不会这么写的,虽然看起来很cooooooool!但是少写10几行代码的代价就是后人理解起来要花费10倍的时间。

你可能感兴趣的:(412. Fizz Buzz and 463. Island Perimeter)