【Python 算法零基礎 2.模擬 ⑤ 基于棧和隊列】

目錄

基于棧

Ⅰ、1441. 用棧操作構建數組

算法與思路

① 初始化操作序列

② 遍歷數字范圍

③ 判斷并添加操作

④ 提前結束循環

⑤ 返回操作序列

基于隊列

?Ⅰ、1700. 無法吃午餐的學生數量

思路與算法

① 統計學生對三明治的需求:

② 遍歷三明治供應順序:


向山而行,你只管往前走

????????????????????????????????—— 25.5.11

基于棧

? ? ? ? 利用的數據結構,如:

Ⅰ、1441. 用棧操作構建數組

給你一個數組?target?和一個整數?n。每次迭代,需要從??list = { 1 , 2 , 3 ..., n }?中依次讀取一個數字。

請使用下述操作來構建目標數組?target?:

  • "Push":從?list?中讀取一個新元素, 并將其推入數組中。
  • "Pop":刪除數組中的最后一個元素。
  • 如果目標數組構建完成,就停止讀取更多元素。

題目數據保證目標數組嚴格遞增,并且只包含?1?到?n?之間的數字。

請返回構建目標數組所用的操作序列。如果存在多個可行方案,返回任一即可。

示例 1:

輸入:target = [1,3], n = 3
輸出:["Push","Push","Pop","Push"]
解釋: 
讀取 1 并自動推入數組 -> [1]
讀取 2 并自動推入數組,然后刪除它 -> [1]
讀取 3 并自動推入數組 -> [1,3]

示例 2:

輸入:target = [1,2,3], n = 3
輸出:["Push","Push","Push"]

示例 3:

輸入:target = [1,2], n = 4
輸出:["Push","Push"]
解釋:只需要讀取前 2 個數字就可以停止。

提示:

  • 1 <= target.length <= 100
  • 1 <= n <= 100
  • 1 <= target[i] <= n
  • target?嚴格遞增
算法與思路
① 初始化操作序列

創建一個空列表?res,用于存儲操作序列("Push" 或 "Pop")。初始化一個索引變量?i?為?0,用于遍歷目標數組?target

② 遍歷數字范圍

使用?for?循環遍歷從?1?到?n?的整數,循環變量為?j

③ 判斷并添加操作

對于每個?j,檢查?target[i]?是否等于?j:如果相等,說明當前數字在目標數組中,將 "Push" 添加到操作序列?res?中,并將索引?i?加?1,表示已處理完目標數組中的一個元素。如果不相等,說明當前數字不在目標數組中,先將 "Push" 添加到操作序列?res?中,再添加 "Pop",表示將該數字壓入棧后立即彈出。

④ 提前結束循環

在每次循環中,檢查索引?i?是否大于或等于目標數組?target?的長度。如果是,說明目標數組中的元素已全部處理完,提前結束循環。

⑤ 返回操作序列

循環結束后,返回操作序列?res

class Solution:def buildArray(self, target: List[int], n: int) -> List[str]:res = []i = 0for j in range(1, n + 1):if target[i] == j:res.append("Push")i += 1else:res.append("Push")res.append("Pop")if i >= len(target):breakreturn res


基于隊列

? ? ? ? 利用隊列的數據結構,如:

?Ⅰ、1700. 無法吃午餐的學生數量

學校的自助午餐提供圓形和方形的三明治,分別用數字?0?和?1?表示。所有學生站在一個隊列里,每個學生要么喜歡圓形的要么喜歡方形的。
餐廳里三明治的數量與學生的數量相同。所有三明治都放在一個??里,每一輪:

  • 如果隊列最前面的學生?喜歡?棧頂的三明治,那么會?拿走它?并離開隊列。
  • 否則,這名學生會?放棄這個三明治?并回到隊列的尾部。

這個過程會一直持續到隊列里所有學生都不喜歡棧頂的三明治為止。

給你兩個整數數組?students?和?sandwiches?,其中?sandwiches[i]?是棧里面第?i???????個三明治的類型(i = 0?是棧的頂部),?students[j]?是初始隊列里第?j???????名學生對三明治的喜好(j = 0?是隊列的最開始位置)。請你返回無法吃午餐的學生數量。

示例 1:

輸入:students = [1,1,0,0], sandwiches = [0,1,0,1]
輸出:0 
解釋:
- 最前面的學生放棄最頂上的三明治,并回到隊列的末尾,學生隊列變為 students = [1,0,0,1]。
- 最前面的學生放棄最頂上的三明治,并回到隊列的末尾,學生隊列變為 students = [0,0,1,1]。
- 最前面的學生拿走最頂上的三明治,剩余學生隊列為 students = [0,1,1],三明治棧為 sandwiches = [1,0,1]。
- 最前面的學生放棄最頂上的三明治,并回到隊列的末尾,學生隊列變為 students = [1,1,0]。
- 最前面的學生拿走最頂上的三明治,剩余學生隊列為 students = [1,0],三明治棧為 sandwiches = [0,1]。
- 最前面的學生放棄最頂上的三明治,并回到隊列的末尾,學生隊列變為 students = [0,1]。
- 最前面的學生拿走最頂上的三明治,剩余學生隊列為 students = [1],三明治棧為 sandwiches = [1]。
- 最前面的學生拿走最頂上的三明治,剩余學生隊列為 students = [],三明治棧為 sandwiches = []。
所以所有學生都有三明治吃。

示例 2:

輸入:students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
輸出:3

提示:

  • 1 <= students.length, sandwiches.length <= 100
  • students.length == sandwiches.length
  • sandwiches[i]?要么是?0?,要么是?1?。
  • students[i]?要么是?0?,要么是?1?。
    思路與算法
    ① 統計學生對三明治的需求

    ????????Ⅰ、初始化一個字典?dict?用于記錄每種類型三明治的需求數量。

    ????????Ⅱ、遍歷學生列表?students,統計每種類型(0 或 1)的學生數量,并更新字典。例如,若有 3 個學生喜歡類型 0 的三明治,dict[0] = 3

    ????????Ⅲ、初始化計數器?count?為學生總數,用于記錄剩余未領取三明治的學生數量

    ② 遍歷三明治供應順序

    按順序遍歷三明治列表?sandwiches。對于每個三明治:

    ? ? ? ? Ⅰ、檢查需求是否為 0:若當前三明治類型的需求數為 0(即?dict[sand] == 0),說明沒有學生喜歡這種類型的三明治,無法繼續分配,返回剩余學生數?count

    ? ? ? ? Ⅱ、分配三明治:若需求數大于 0,將對應類型的需求數減 1(dict[sand] -= 1,并將剩余學生數減 1(count -= 1

    ? ? ? ? Ⅲ、返回結果:若所有三明治都被分配完畢,返回剩余學生數?count(此時應為 0)。

    class Solution:def countStudents(self, students: List[int], sandwiches: List[int]) -> int:dict = {}count = 0for s in students:dict[s] = dict.get(s, 0) + 1count += 1for sand in sandwiches:if dict.get(sand, 0) == 0:return countelse:dict[sand] -= 1count -= 1return count

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/80621.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80621.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/80621.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    管家婆實用貼-如何在Excel中清除空格

    我們在使用管家婆軟件時&#xff0c;經常會用到Excel表格導入導出數據&#xff0c;在使用Excel整理數據時&#xff0c;數據中的空格可能會導致計算和分析出現問題。無論是多余的前導空格、尾部空格還是單元格中的不必要空格&#xff0c;清除它們都是確保數據準確性的關鍵。今天…

    uniapp-商城-53-后臺 商家信息(更新修改和深淺copy)

    1、概述 文章主要討論了在數據庫管理中如何處理用戶上傳和修改商家信息的問題&#xff0c;特別是通過深淺拷貝技術來確保數據更新的準確性和安全性。 首先&#xff0c;解釋了深拷貝和淺拷貝的區別&#xff1a;淺拷貝使得兩個變量共享相同的內存地址&#xff0c;而深拷貝則創建新…

    numpy模塊綜合使用

    一、numpy模塊的綜合使用方法 # 使用矩陣的好處&#xff0c;矩陣對于python中列表&#xff0c;字典等數據類型一個一個拿來計算是會方便計算很多的&#xff0c;底層使用的是c語言 # 在數據分析和數據處理的時候也經常常用 import numpy as np array np.array([[1,2,3],[2,3,4…

    【github分享】開發者學習路線圖

    地址&#xff1a;GitHub - kamranahmedse/developer-roadmap: Interactive roadmaps, guides and other educational content to help developers grow in their careers. 介紹&#xff1a;涵蓋了所有領域的開發者路線圖&#xff0c;前端、后端、運維、全棧、編程語言、AI等。…

    《Linux命令行大全(第2版)》PDF下載

    內容簡介 本書對Linux命令行進行詳細的介紹&#xff0c;全書內容包括4個部分&#xff0c;第一部分由Shell的介紹開啟命令行基礎知識的學習之旅&#xff1b;第二部分講述配置文件的編輯&#xff0c;如何通過命令行控制計算機&#xff1b;第三部分探討常見的任務與必備工具&…

    [Java實戰]Spring Boot 解決跨域問題(十四)

    [Java實戰]Spring Boot 解決跨域問題&#xff08;十四&#xff09; 一、CORS 問題背景 什么是跨域問題&#xff1f; 當瀏覽器通過 JavaScript 發起跨域請求&#xff08;不同協議、域名、端口&#xff09;時&#xff0c;會觸發同源策略限制&#xff0c;導致請求被攔截。 示例場…

    MyBatis快速入門——實操

    默認&#xff1a;電腦搭建好了Maven環境 本次入門實驗使用的idea版本&#xff1a;ideaU2022.1 目錄 一&#xff1a;前期準備工作 1. 創建一個springboot工程 2. Maven環境配置 3. 在mysql數據庫中創建一個user表 4. 編寫實體類User 二&#xff1a; 引入MyBatis的相關依賴…

    IPLOOK超輕量核心網,助力5G專網和MEC邊緣快速落地

    隨著5G深入千行百業&#xff0c;行業客戶對核心網的靈活性、可控性和部署效率提出了更高要求。IPLOOK面向數字化轉型需求&#xff0c;推出了超輕量級核心網解決方案&#xff0c;具備體積小、資源占用少、部署靈活、易于維護等特性&#xff0c;廣泛適用于專網、實驗室、MEC邊緣云…

    【前端】【HTML】【總復習】一萬六千字詳解HTML 知識體系

    ?? HTML 知識體系 一、HTML 基礎入門 1. HTML 簡介與作用 HTML(HyperText Markup Language,超文本標記語言)是構建網頁的基礎語言。它的核心作用是: 定義網頁內容的結構(標題、段落、圖片、表格等)提供語義化標簽,幫助搜索引擎與輔助設備理解頁面內容配合 CSS 實現…

    VC++ 獲取CPU信息的兩種方法

    文章目錄 方法一&#xff1a;使用 Windows API GetSystemInfo 和 GetNativeSystemInfo (基本信息)編譯和運行代碼解釋 方法二&#xff1a;使用 __cpuid&#xff08;CPU序列號、特性等&#xff09;代碼解釋&#xff1a; 開發過程中需要使用 VC獲取電腦CPU信息&#xff0c;先總結…

    Docker Compose 的歷史和發展

    這張圖表展示了Docker Compose從V1到V2的演變過程&#xff0c;并解釋了不同版本的Compose文件格式及其支持情況。以下是對圖表的詳細講解&#xff1a; Compose V1 No longer supported: Compose V1已經不再支持。Compose file format 3.x: 使用了版本3.x的Compose文件格式。 …

    24、TypeScript:預言家之書——React 19 類型系統

    一、預言家的本質 "TypeScript是魔法世界的預言家之書&#xff0c;用靜態類型編織代碼的命運軌跡&#xff01;" 霍格沃茨符文研究院的巫師揮動魔杖&#xff0c;類型注解與泛型的星軌在空中交織成防護矩陣。 ——基于《國際魔法聯合會》第12號類型協議&#xff0c;Ty…

    (2025,AR,NAR,GAN,Diffusion,模型對比,數據集,評估指標,性能對比)文本到圖像生成和編輯:綜述

    【本文為我在去年完成的綜述&#xff0c;因某些原因未能及時投稿&#xff0c;但本文仍能為想要全面了解文本到圖像的生成和編輯的學習者提供可靠的參考。目前本文已投稿 ACM Computing Surveys。 完整內容可在如下鏈接獲取&#xff0c;或在 Q 群群文件獲取。 中文版為論文初稿&…

    MATLAB的cvpartition函數用法

    1. 函數作用 cvpartition 將數據集劃分為訓練集和測試集&#xff0c;支持多種交叉驗證方法&#xff0c;包括&#xff1a; Hold-Out驗證&#xff1a;單次劃分&#xff08;如70%訓練&#xff0c;30%測試&#xff09;K折交叉驗證&#xff1a;數據分為K個子集&#xff0c;依次用其…

    Java【網絡原理】(5)深入淺出HTTPS:狀態碼與SSL/TLS加密全解析

    目錄 1.前言 2.正文 2.1狀態碼 2.2HTTP與HTTPS的關系 2.3SSL協議 2.3.1對稱加密 2.3.2非對稱加密 2.3.3中間人攻擊 2.3.4校驗機制 2.3.4.1證書 2.3.4.2數字簽名 1. 數字簽名的生成過程 2. 數字簽名的驗證過程 2.4TLS協議&#xff08;握手過程&#xff09; 3.小結…

    代碼隨想錄算法訓練營第三十七天

    LeetCode題目: 300. 最長遞增子序列674. 最長連續遞增序列718. 最長重復子數組2918. 數組的最小相等和(每日一題) 其他: 今日總結 往期打卡 300. 最長遞增子序列 跳轉: 300. 最長遞增子序列 學習: 代碼隨想錄公開講解 問題: 給你一個整數數組 nums &#xff0c;找到其中最長…

    【Java ee初階】網絡原理

    TCP協議 1.確認應答 實現可靠傳輸的核心機制 2.超時重傳 實現可靠傳輸的核心機制 3.連接管理 網絡部分最高頻的面試題 4.滑動窗口 提高傳輸效率的機制 5.流量控制 依據接收方的處理能力&#xff0c;限制發送方的發送速度。 6.擁塞控制 依據傳輸鏈路的處理能力&#xff0c…

    B站取關腳本

    個人的賬號可能被盜了&#xff0c;發現關注數量蹦到3000多&#xff0c;然后b站沒有一鍵取關的按鈕&#xff0c;并且對api的訪問有速度限制&#xff0c;然后網上的腳本很多都已經失效了&#xff0c;所以自己稍微寫個簡陋的 測試時間: 2025.05.11 使用步驟: 進入b站的關注頁面…

    PyGame游戲開發(含源碼+演示視頻+開結題報告+設計文檔)

    前言&#xff1a; 大二小學期python課上基于pygame做的一個游戲小demo&#xff0c;當時老師花了一天講解了下python基礎語法后&#xff08;也是整個大學四年唯一學習python的時間&#xff09;&#xff0c;便讓我們自學網課一周然后交項目&#xff0c;所以做的非常倉促&#xff…

    使用 React 實現語音識別并轉換功能

    在現代 Web 開發中&#xff0c;語音識別技術的應用越來越廣泛。它為用戶提供了更加便捷、自然的交互方式&#xff0c;例如語音輸入、語音指令等。本文將介紹如何使用 React 實現一個簡單的語音識別并轉換的功能。 功能概述 我們要實現的功能是一個語音識別測試頁面&#xff0…