今天这一题是关于一个小技巧。题目是这样的:
给定一个表示行进方向的列表,如["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的语法,写出简洁的代码,始终是一种追求。