【力扣】【設計】面試03.06:動物收容所

題目描述

動物收容所。有家動物收容所只收容狗與貓,且嚴格遵守“先進先出”的原則。在收養該收容所的動物時,收養人只能收養所有動物中“最老”(由其進入收容所的時間長短而定)的動物,或者可以挑選貓或狗(同時必須收養此類動物中“最老”的)。換言之,收養人不能自由挑選想收養的對象。

請創建適用於這個系統的數據結構,實現各種操作方法,比如enqueue、dequeueAny、dequeueDog和dequeueCat。

enqueue方法有一個animal參數,animal[0]代表動物編號,animal[1]代表動物種類,其中 0 代表貓,1 代表狗。

dequeue*方法返回一個列表[動物編號, 動物種類],若沒有可以收養的動物,則返回[-1,-1]

來源:力扣(LeetCode)

算法思路

這道設計很簡單,先進先出就使用隊列好了,爲了保證速度可以使用雙端隊列deque
我們可以維護兩個雙端隊列self.catself.dogappend先進popleft先出即可。

這裏只有一點要注意,就是dequeueAny這個方法,如何得到貓和狗中的較老者?給動物編號即可。

class AnimalShelf:

    def __init__(self):
        self.cat=deque()
        self.dog=deque()
        self.n=0

    def enqueue(self, animal: List[int]) -> None:
        if animal[1]:
            self.dog.append([animal[0],self.n])
        else:
            self.cat.append([animal[0],self.n])
        self.n+=1

    def dequeueAny(self) -> List[int]:
        if not self.cat and not self.dog:return [-1,-1]
        if not self.dog:
            return [self.cat.popleft()[0],0]
        if not self.cat:
            return [self.dog.popleft()[0],1]
        return [self.cat.popleft()[0],0] if self.cat[0][1]<self.dog[0][1] else [self.dog.popleft()[0],1]

    def dequeueDog(self) -> List[int]:
        if not self.dog:return [-1,-1]
        return [self.dog.popleft()[0],1]
    def dequeueCat(self) -> List[int]:
        if not self.cat:return [-1,-1]
        return [self.cat.popleft()[0],0]

執行用時 :148 ms, 在所有 Python3 提交中擊敗了96.39%的用戶
內存消耗 :21.9 MB, 在所有 Python3 提交中擊敗了100.00%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章