列表的用法

1. 列表的定義

先進(jìn)先出(FIFO)

2. 用法

類代碼如下:

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.insert(0, item)

    def pop(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

    def is_empty(self):
        return self.items == []

3. 算法運(yùn)用

① 約瑟夫環(huán)
劍指offer62

    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

    def is_empty(self):
        return self.items == []

# num為傳遞的次數(shù),每隔一個(gè)人就是傳遞1次
class Solution:
    def lastRemaining(self, n: int, num = 2) -> int:
        lst = Queue()
        for i in range(n):
            lst.enqueue(i)
        while lst.size() >1:
            for i in range(num):
                lst.enqueue(lst.dequeue())
            lst.dequeue()
        return lst.dequeue()

先按頭消去,每隔一個(gè)消去;再從第二個(gè)每隔一個(gè)消去
【1,2,3,4,5,6】→【2,4,6】→【2,6】→【6】
這種方法代碼如下:

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

    def is_empty(self):
        return self.items == []

# num為傳遞的次數(shù),每隔一個(gè)人就是傳遞1次
class Solution:
    def lastRemaining(self, n: int, num = 1) -> int:
        lst = Queue()
        flag = 0
        for i in range(1, n+1):
            lst.enqueue(i)
        mark = lst.size() % 2
        while lst.size() // 2 > 0:
            if flag == 0:
                lst.dequeue()
                for i in range(lst.size()//2):
                    for j in range(num):
                        lst.enqueue(lst.dequeue())
                    lst.dequeue()

                flag = 1
                if mark == 0:
                    lst.enqueue(lst.dequeue())
            else:
                for i in range(lst.size()//2):
                    for j in range(num):
                        lst.enqueue(lst.dequeue())
                    lst.dequeue()
                    
                flag = 0
                if mark == 0:
                    lst.enqueue(lst.dequeue())
                    
        return lst.dequeue()

LeetCode 390. 消除游戲

#采用隊(duì)列和棧的思想,不過雖然超時(shí),但是是正確的。
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

    def is_empty(self):
        return self.items == []

# num為傳遞的次數(shù),每隔一個(gè)人就是傳遞1次
class Solution:
    def lastRemaining(self, n: int, num = 1) -> int:
        lst = Queue()
        flag = 0
        for i in range(1, n+1):
            lst.enqueue(i)
        
        while lst.size() // 2 > 0:
            mark = lst.size() % 2
            if flag == 0:
                lst.dequeue()
                for i in range(lst.size()//2):
                    for j in range(num):
                        lst.enqueue(lst.dequeue())
                    lst.dequeue()

                flag = 1
                if mark == 0:
                    lst.enqueue(lst.dequeue())

            else:
                lst.items.pop(0)
                for i in range(lst.size()//2):
                    for j in range(num):
                        lst.items.append(lst.items.pop(0))
                    lst.items.pop(0)
                flag = 0
                if mark == 0:
                    lst.items.append(lst.items.pop(0))
                
        return lst.dequeue()

4 雙向隊(duì)列

兩邊可以加?xùn)|西與減東西


image.png

python有雙向隊(duì)列的庫,可以直接導(dǎo)入:

from collections import deque
image.png

題目:

  1. LeetCode 239:雙向隊(duì)列
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        res = []
        from collections import deque
        queue = deque()
        for i in range(len(nums)):
            if queue and queue[0] < i-k+1:
                queue.popleft()
            while queue and nums[queue[-1]] < nums[i]:
                queue.pop()
            queue.append(i)
            
            if i >= k-1:
                res.append(nums[queue[0]])
        
        return res
  1. Leetcode 9. Palindrome Number
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        if x == 0:
            return True
        
        res = deque()
        for i in str(x):
            res.append(i)
            
        mark = True
        
        while len(res) > 1 and mark is True:
            if res.pop() != res.popleft():
                mark = False
        
        return mark
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 眾所周知,我們可以通過索引值(或稱下標(biāo))來查找序列類型(如字符串、列表、元組…)中的單個(gè)元素,那么,如果要獲取一個(gè)...
    山禾家的貓閱讀 552評(píng)論 0 0
  • 列表基礎(chǔ) 創(chuàng)建列表 創(chuàng)建一個(gè)空列表 創(chuàng)建一個(gè)含有元素的列表 創(chuàng)建一個(gè)多類型元素列表 創(chuàng)建嵌套列表 訪問元素列表訪問...
    寒江孤影丶閱讀 390評(píng)論 0 0
  • 這篇文章的由來是因?yàn)橹跎系倪@個(gè)問題:《如何高效使用2do并融入gtd體系,清單創(chuàng)建有哪些建議?》 TL; DR:...
    HybridRbt閱讀 4,359評(píng)論 1 11
  • a =["zhangshan","lis","ww","dfad","asdfd"] """ 在python的使用...
    余國勇閱讀 565評(píng)論 0 0
  • 一、反轉(zhuǎn)問題 2021.02.11 No.25 K個(gè)一組翻轉(zhuǎn)鏈表 給你一個(gè)鏈表,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn),請(qǐng)你返...
    維李設(shè)論閱讀 761評(píng)論 0 0

友情鏈接更多精彩內(nèi)容