今天這一題是關於一個小技巧。題目是這樣的: 給定一個表示行進方向的列表,如["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"],對它進行簡化。 如何簡化呢?比如第一步是向北走,第二步是向南走,實際上相當於原地不動,這兩步可以抵消。東 ...
今天這一題是關於一個小技巧。題目是這樣的:
給定一個表示行進方向的列表,如["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"],對它進行簡化。
如何簡化呢?比如第一步是向北走,第二步是向南走,實際上相當於原地不動,這兩步可以抵消。東西向也是同樣的道理。
分析:
解法的邏輯非常簡單,相當於把輸入列表的元素依次加入一個棧(stack),如果要加入的元素與棧頂的元素可以抵消,則該元素不加入,且要pop棧頂的元素。
實現要點:
1. 如何表示“可以抵消”?
可以啰嗦的寫為:
if (a == 'SOUTH' and b == 'NORTH') \
or (a == 'NORTH' and b == 'SOUTH') \
or (a == 'EAST' and b == 'WEST') \
or (a == 'WEST' and b == 'EAST')
但是更簡單的做法是事先創建一個字典:
opposite = {'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'}
則上述代碼可以簡化為:if a == opposite(b)
2. 棧的實現:
棧可以方便的用list實現。入棧用list.append(),出棧用list.pop(),棧頂元素為list[-1]。
借用某個源代碼:
opposite = {'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'} def dirReduc(plan): new_plan = [] for d in plan: if new_plan and new_plan[-1] == opposite[d]: new_plan.pop() else: new_plan.append(d) return new_plan
靈活運用Python的語法,寫出簡潔的代碼,始終是一種追求。