美文网首页
强迫症老板和他的洗碗工

强迫症老板和他的洗碗工

作者: ccpjsg | 来源:发表于2020-10-30 15:52 被阅读0次

    故事呢,比较简单。有个餐馆老板,给他的十个碗编号为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。

    目前呢,就想到这么一些。栈嘛,先进后出,后进先出。想一万遍。

    相关文章

      网友评论

          本文标题:强迫症老板和他的洗碗工

          本文链接:https://www.haomeiwen.com/subject/tzddvktx.html