主要寫寫這兩個問題在Solutions里的one line python的解法,題目本身都很容易。
- 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除了邏輯運算符的功能外,還有一個語義是返回第一個非空對象,第二個是字符串也可以用乘法(以前只知道加法。。。)
- 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倍的時間。