故事呢,比较简单。有个餐馆老板,给他的十个碗编号为0-9。他有强迫症,要求他的洗碗工洗碗叠起来的时候,必须小号在下,大号在上的原则叠放。当客人拿碗的时候,老板就记下编号。这样,老板就可以通过编号判断洗碗工是不是按照要求来洗碗。比如老板记下4321056789,这个编号表明工人是按照要求来写的。但是老板记下4231089765的时候,老板就知道工人没有按照要求来写。
我用python这个语言来写。根据老板记下的编号来判断洗碗工是否按照要求来叠放碗。
这个题目从开始看到至我解决,花了两天吧。似乎是昨天上午看到(最近记性也不好了,具体什么时候也记不清了),今天下午两点半解决。解决的时候,我也并不是很清楚。现在写这个文章就是为了能想的更透彻一点。
先贴上我的代码,再按照代码来分析。
def pan(por):
s=[]
ma=0
for i in por:
num=int(i)
if s==[]:
s.extend(list(range(ma,num)))
ma=num+1
else:
if num==s[-1]:
s.pop()
elif num<s[-1]:
return False
elif num>s[-1]:
s.extend(list(range(ma,num)))
ma=num+1
if s==[]:
return True
por = input()
if pan(por):
print('Yes')
else:
print('No')
首先,整体结构当然是输入老板的编号记录,以字符串形式,然后用函数pan判断。如果洗碗工按照老板要求则返回真True,打印Yes。如果没有按照要求,则是选择结构的else分支,打印No。
下面,就来说说这个判断函数pan的结构。我的想法是当顾客拿到一个盘子后,就可以先判断盘子的叠放情况。初始化一个栈结构,因为盘子叠放明显是一个栈结构问题。这个栈是去除这个盘子编号的,代表已经被拿走了。然后下一个编号,如果这个编号等于栈顶,那说明正好是拿了刚才的下一个碗。如果小于栈顶,那肯定不行,因为跳过了,这时候直接返回False,不用再判断剩下的碗编号了。如果大于栈顶。说明这时候洗碗工又洗了几个碗放上去了。这时候需要再入栈操作。这时候需要注意标记好之前栈的最大编号。以免重复入栈碗的编号。
最后,如果碗是正确叠放的,那栈肯定为空。那么就返回真True。
目前呢,就想到这么一些。栈嘛,先进后出,后进先出。想一万遍。
网友评论