1. 程式人生 > >leetcode 860. 檸檬水找零

leetcode 860. 檸檬水找零

在檸檬水攤上,每一杯檸檬水的售價為 5 美元。

顧客排隊購買你的產品,(按賬單 bills 支付的順序)一次購買一杯。

每位顧客只買一杯檸檬水,然後向你付 5 美元、10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。

注意,一開始你手頭沒有任何零錢。

如果你能給每位顧客正確找零,返回 true ,否則返回 false 。

示例 1:

輸入:[5,5,5,10,20]
輸出:true
解釋:
前 3 位顧客那裡,我們按順序收取 3 張 5 美元的鈔票。
第 4 位顧客那裡,我們收取一張 10 美元的鈔票,並返還 5 美元。
第 5 位顧客那裡,我們找還一張 10 美元的鈔票和一張 5 美元的鈔票。
由於所有客戶都得到了正確的找零,所以我們輸出 true。

示例 2:

輸入:[5,5,10]
輸出:true

示例 3:

輸入:[10,10]
輸出:false

示例 4:

輸入:[5,5,10,10,20]
輸出:false
解釋:
前 2 位顧客那裡,我們按順序收取 2 張 5 美元的鈔票。
對於接下來的 2 位顧客,我們收取一張 10 美元的鈔票,然後返還 5 美元。
對於最後一位顧客,我們無法退回 15 美元,因為我們現在只有兩張 10 美元的鈔票。
由於不是每位顧客都得到了正確的找零,所以答案是 false。

提示:

  • 0 <= bills.length <= 10000
  • bills[i] 不是 5 就是 10 或是 20 

思路:1、建立兩個列表,List儲存每次購買後剩餘的零錢,res儲存找零失敗的情況;

           2、分三種情況分別討論,5,10,20購買,傻瓜式的一次次判斷能否找零

下邊程式碼用的是最傻瓜式的方式判斷: 

class Solution(object):
    def lemonadeChange(self, bills):
        """
        :type bills: List[int]
        :rtype: bool
        """
        if len(bills) == 0:
            return True
        List = []
        res = []
        for i in range(len(bills)):
            if bills[i] == 5:
                List.append(5)
            elif bills[i] == 10:
                if (5 in List):
                    List.remove(5)
                    List += [10]
                else:
                    res.append(0)
            elif bills[i] == 20:
                if (5 in List):
                    List.remove(5)
                    if (10 in List):
                        List.remove(10)
                    elif (10 not in List) and (5 in List):
                        List.remove(5)
                        if (5 in List):
                            List.remove(5)
                        else:
                            res.append(0)
                    else:
                        res.append(0)
                else:
                    res.append(0)
            else:
                res.append(0)
        if len(res) >= 1:
            return False
        else:
            return True

程式碼二:

class Solution:
    def lemonadeChange(self, bills):
        if not bills: return True
        count = [0,0]
 
        #如果給5元就拿過來,如果給10元則找5元,如果給20元則找回3個5元或者1個5元1個10元
        for item in bills:
            if item == 5: count[0] += 1
            elif item == 10:#此時需要找還5元
                if count[0] > 0:#5元的還有
                    count[0] -= 1
                    count[1] += 1
                else: return False
            elif item == 20:#找回3個5元或者1個5元1個10元
                if count[1] > 0 and count[0] > 0:
                    count[1] -= 1
                    count[0] -= 1
                elif count[0] >= 3:
                    count[0] -= 3
                else: return False
        return True