【算法】模擬專題

  • 什么是模擬?
    是一種通過模仿現實世界或問題場景的運行過程來求解問題的算法思想。它不依賴復雜的數學推導或邏輯優化,而是按照問題的實際規則、步驟或流程,一步步地 “復現” 過程,最終得到結果。
    使用場景:

當問題的邏輯規則明確、步驟可分解,且難以用數學公式直接求解時,模擬算法是直觀有效的選擇。常見場景包括:
過程性問題:如交通流量模擬、電梯運行調度、銀行排隊系統等;
規則性問題:如模擬棋牌游戲(圍棋、撲克)的出牌邏輯、模擬電路時序等;
數值計算模擬:如天氣預報中的大氣環流模擬、物理實驗中的粒子運動模擬等。
總結
模擬算法是一種 “按部就班” 的求解思路,通過復現問題的實際過程得到結果,適合規則明確、步驟可模擬的場景。它的優勢在于直觀和易實現,缺點是在大規模問題中可能效率較低,需根據具體場景權衡使用。

一. (1576.) 替換所有的問號

在這里插入圖片描述
解法:
要求不能包含連續的重復字符,根據題目模擬,從前往后遍歷整個字符串,找到問號之后就用a~z的每一個字符去嘗試替換

class Solution
{
public:string modifyString(string s) {int n = s.size();for(int i = 0; i < n; i++){if(s[i] == '?') // 替換{for(char ch = 'a'; ch <= 'z'; ch++){if((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i 
+ 1]))//巧妙的判斷了頭尾邊界情況,不是邊界情況時要滿足i位置字符與左右兩邊不同{s[i] = ch;break;}}}}return s;}
};

二. (495.) 提莫攻擊

在這里插入圖片描述
模擬 + 分情況討論。
計算相鄰兩個時間點的差值:
i. 如果差值?于等于中毒時間,說明上次中毒可以持續 duration 秒;
ii. 如果差值?于中毒時間,那么上次的中毒只能持續兩者的差值。
注意:最后一次中毒時間要全部加上,因為沒法與后一個元素計算差值

class Solution {
public:int findPoisonedDuration(vector<int>& t, int d) {int ret=0;for(int i=1;i<t.size();i++){int add=t[i]-t[i-1];//判斷要增加的秒數if(add<d) ret+=add;else ret+=d;}//處理最后一個元素,秒數全部加上ret+=d;return ret;}
};

三. (6.) N 字形變換

在這里插入圖片描述
算法原理:

  • 解法1模擬
    在這里插入圖片描述

直接利用坐標規律填入數據,形成新字符串時也要再遍歷一遍數組,總共需要兩次,時間復雜度和空間復雜度都一樣有點高

  • 解法2:找規律
    可以先通過具體行數的一個例證找到一種規律,再通過不同行數的例子來驗證是否正確。

在這里插入圖片描述
通過行數為4的情況來找規律
1.利用原字符串下標來進行找規律,就不需要遍歷數組,直接在原字符串中操作添加到新字符串來提高效率。圖中數組是為了方便找規律,不加入實際代碼中
2.列數小于原字符串大小就夠用,計算每一行元素之間的公差,找到規律并驗證
3.第一行和最后一行的處理情況相同,中間行元素要兩個兩個一起遞增相加
4.注意當行數等于1時的特殊情況,直接返回原字符串,避免進入死循環(公差為0)

class Solution {
public:string convert(string s, int n) {//處理特殊情況if(n==1) return s;//公差int d=2*n-2;string ret;//處理第一行元素for(int i=0;i<s.size();i+=d) ret+=s[i];//處理中間行元素for(int i=1;i<n-1;i++)//遍歷中間每一行{for(int k=i,j=d-i;k<s.size()||j<s.size();k+=d,j+=d){//||保證有一個元素在范圍內,添加時要先進性判斷if(k<s.size()) ret+=s[k];if(j<s.size()) ret+=s[j];}}//處理最后一行元素for(int i=n-1;i<s.size();i+=d) ret+=s[i];return ret;}
};

四. (38.) 外觀數列

在這里插入圖片描述
解法:
利用雙指針,開始都指向頭位置,一個移動另一個不動,元素相等時后移直到不等時停止,計算差值即為不動指針所對應的元素個數,然后更新不動指針,如此循環往復

class Solution {
public:string countAndSay(int n) {string ret="1";for(int i=1;i<n;i++)// 解釋 n - 1 次 ret 即可{string tmp;//用于記錄下一項的臨時變量,ret為當前解析的字符串int len=ret.size();int count=1;//統計連續相同字符的個數,最少出現一次for(int left=0,right=0;right<len;){// 移動right,找到與ret[left]不同的第一個位置while(right<len&&ret[left]==ret[right]) right++;count=right-left;// 拼接:"連續的個數" + "字符本身"tmp+=to_string(count)+ret[left];// 移動left到right的位置,開始統計下一組連續字符left=right;}ret=tmp;}return ret;}
};

解析:
得到外觀數列第n項的結果,只需要解析前n-1項即可。第一項一定為1,所以從1開始解析,創建一個變量tmp來存儲解析后作為下一次解析的字符串。內層循環中通過雙指針遍歷當前項,解析完后更新當前項,繼續迭代下去

注意:
1.初始化方式完全不同

string ret=“1”:

是包含單個字符 ‘1’ 的字符串,ret.size() 為 1,ret[0] 為 ‘1’(ASCII 碼值為 49)。

string ret{1}:

此時會調用 std::string 的另一個構造函數:string(size_t n, char c),該構造函數的含義是 “創建一個包含 n 個字符 c 的字符串”。 1 會被隱式轉換為size_t 類型(無符號整數),作為第一個參數(字符個數),整數 1 會被當作 char 類型的 ASCII 碼值,即 string ret{1}; 等價于 string ret(1, ‘\x01’),其中 ‘\x01’ 是 ASCII 碼為 1 的控制字符(SOH,標題開始符)
這樣初始化的結果是一個長度為 1 的字符串,但包含的字符是 ASCII 碼為 1 的不可見控制字符(而非字符 ‘1’),ret[0] 的值為 1(十進制),而非 49。
本質:用整數對應的ASCII 碼值初始化,字符串內容是該 ASCII 碼對應的字符(通常是不可見的控制字符)。

2.字符串拼接邏輯
std::string的operator+=支持以下常見形式:
追加單個字符:ret += ‘a’
追加字符串:ret += “abc” 或 ret += another_str
不支持ret += {str1, str2}這種初始化列表形式,整數轉為字符串要加to_string()

五. (1419.) 數?蛙

在這里插入圖片描述

解法
在這里插入圖片描述
? 當遇到 ‘r’ ‘o’ ‘a’ ‘k’ 這四個字符的時候,我們要去看看每?個字符對應的前驅字符,
有沒有?蛙叫出來。如果有?蛙叫出來,那就讓這個?蛙接下來喊出來這個字符;如果沒有,直接返回 -1 ;
? 當遇到 ‘c’ 這個字符的時候,我們去看看 ‘k’ 這個字符有沒有?蛙叫出來。如果有,就讓這個?蛙繼續去喊 ‘c’ 這個字符;如果沒有的話,就重新搞?個?蛙。

  • if-else方法
    完全模擬上圖過程即可,只需注意返回值時的多種情況
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {int c=0,r=0,o=0,a=0,k=0;for(auto ch:croakOfFrogs){if(ch=='c'){if(k!=0){k--;c++;}else c++;}else if(ch=='r'){if(c!=0){c--;r++;}else return -1;}else if(ch=='o'){if(r!=0){r--;o++;}else return -1;}else if(ch=='a'){if(o!=0){o--;a++;}else return -1;}else if(ch=='k'){if(a!=0){a--;k++;}else return -1;}}//判斷一次完整的蛙叫都沒有if(k==0) return -1;//判斷c不能滿足一次蛙叫的情況,可以和除k以外的字符比較是否相等//不能和k比因為可以由一只蛙重復叫else if(c!=r) return -1;else return k;}
};
  • 哈希表方法
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string t="croak";int n=t.size();vector<int>hash(n);//用數組模擬哈希表unordered_map<char,int>index;//為了方便查找下標for(int i=0;i<n;i++){index[t[i]]=i;}for(auto ch:croakOfFrogs){if(ch=='c'){if(hash[n-1]) {hash[n-1]--;hash[0]++;}else hash[0]++;}else{//其他情況都適用,避免了條件判斷int i=index[ch];//得到下標if(hash[i-1]==0) return -1;hash[i-1]--;hash[i]++; }}for(int i=0;i<n-1;i++){//判斷蛙叫是否有效,除k外必須都為0if(hash[i]) return -1;}return hash[n-1];}
};

適用于通用情況,當不知道給定字符串內容時適用,通過數組模擬哈希降低空間復雜度,再用哈希表存儲字符所對應的下標,方便查找。循環時只用分兩組,避免繁雜的情況討論

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

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

相關文章

【FreeRTOS】刨根問底6: 應該如何防止任務棧溢出?

【加關注&#xff0c;不迷路】一、棧溢出&#xff1a;程序世界的“越界洪水”就象一個裝水的玻璃杯&#xff08;棧空間&#xff09;&#xff0c;每次調用函數就像向水杯中倒水&#xff08;壓入保護需要恢復的數據&#xff09;。當函數嵌套調用過深&#xff08;如遞歸失控&#…

牛客周賽 Round 105

A.小苯的xor構造題目描述小紅喜歡整數 k&#xff0c;他想讓小苯構造兩個不相等的非負整數&#xff0c;使得兩數的異或和等于 k。請你幫幫小苯。#include <bits/stdc.h> using namespace std; using ll long long; void solve() {int k;cin>>k;cout<<0<&l…

《R for Data Science (2e)》免費中文翻譯 (第4章) --- Workflow: code style

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …

11-verilog的RTC驅動代碼

verilog的RTC驅動代碼 1.例化parameter SLAVE_ADDR 7h51 ; // 器件地址 parameter BIT_CTRL 1b0 ; // 字地址位控制參數(16b/8b) parameter CLK_FREQ 26d50_000_000; // i2c_dri模塊的驅動時鐘頻率(CLK_FREQ) parameter I2C_FR…

【k8s、docker】Headless Service(無頭服務)

文章目錄問題背景1、什么是Headless Service1.2 為什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行為1.3 驗證示例1.4 如何創建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何創建出來的&#xff1f;…

scikit-learn/sklearn學習|套索回歸Lasso解讀

【1】引言 前序學習進程中&#xff0c;對用scikit-learn表達線性回歸進行了初步解讀。 線性回歸能夠將因變量yyy表達成由自變量xxx、線性系數矩陣www和截距bbb組成的線性函數式&#xff1a; y∑i1nwi?xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n?wi??xi?bwTxb實…

暴雨服務器:以定制化滿足算力需求多樣化

在數字經濟與實體經濟深度融合的浪潮下&#xff0c;互聯網行業正經歷著前所未有的技術變革。大數據分析、云計算服務、人工智能算法等技術的快速演進&#xff0c;推動著企業對于高性能計算基礎設施的需求呈現指數級增長。據IDC數據顯示&#xff0c;互聯網行業已成為全球服務器采…

JavaScript字符串詳解

創建字符串&#xff1a; 1.使用字面量(推薦)&#xff1a; 這是最常用、最直接的方式。你可以用單引號 ()、雙引號 (") 或反引號 () 把文本包起來 let singleQuote 單引號; let doubleQuote "雙引號"; let templateLiteral 反引號;2.使用String 構造函數&…

Kiro Preview 應用評測

Kiro應用評測 Kiro 是一個由亞馬遜推出的 AI 驅動的智能開發環境&#xff0c;從原型到生產全程陪伴您的開發過程。它將"靈感編程"的流暢性與規范的清晰性相結合&#xff0c;幫助您更快地構建更好的軟件。 昨天收到了Kiro的試用郵件&#xff0c;收到郵件后第一時間下載…

Flink2.0學習筆記:Flink服務器搭建與flink作業提交

一&#xff0c;下載flink:Downloads | Apache Flink,解壓后放入IDE工作目錄&#xff1a;我這里以1.17版本為例 可以看到&#xff0c;flink后期的版本中沒有提供window啟動腳本:start-cluster.bat 所以這里要通過windows自帶的wsl 系統啟動它 打開終端依次運行下列命令完成w…

MySQL鎖的分類

MySQL鎖可以按照多個維度進行分類&#xff0c;下面我用最清晰的方式為你梳理所有分類方式&#xff1a;一、按鎖的粒度分類&#xff08;最常用分類&#xff09;鎖類型作用范圍特點適用引擎示例場景表級鎖整張表開銷小、加鎖快&#xff0c;并發度低MyISAM, MEMORY數據遷移、全表統…

電腦上搭建HTTP服務器在局域網內其它客戶端無法訪問的解決方案

在電腦上開發一套HTTP服務器的程序在調試時&#xff0c;在本機內訪問正常&#xff0c;但是在本機外訪問就不正常&#xff0c;外部客戶端無法訪問或無法連接到本機的服務器的問題&#xff0c;這可能涉及網絡配置、防火墻、端口轉發或服務綁定等問題&#xff0c;在這里提供了解決…

雙指針和codetop2(最短路問題BFS)

雙指針和codetop21.雙指針1.[復寫0](https://leetcode.cn/problems/duplicate-zeros/)2.動態規劃1.[珠寶的最高價值](https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/)2.[解碼方法](https://leetcode.cn/problems/decode-ways/)3.[下降路徑最小和](ht…

基于K鄰近算法(KNN)的數據回歸預測模型

一、作品詳細簡介 1.1附件文件夾程序代碼截圖 全部完整源代碼&#xff0c;請在個人首頁置頂文章查看&#xff1a; 學行庫小秘_CSDN博客https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夾說明 1.2.1 main.m主函數文件 該MATLAB代碼實現了一個基于…

【123頁PPT】化工行業數字化解決方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808859/91654005 資料解讀&#xff1a;【123頁PPT】化工行業數字化解決方案 詳細資料請看本解讀文章的最后內容。化工行業作為國民經濟的重要支柱之…

c++--文件頭注釋/doxygen

文件頭注釋 開源項目&#xff1a; /*** file robot_base.cpp* author Mr.Wu* date 2025-05-28* version 1.0.0* brief Robot basic drive to communicate with controller** copyright Copyright (c) 2025 google.** Licensed under the Apache License, Version 2.…

【教程】筆記本安裝FnOS設置合蓋息屏不休眠

重裝FnOS好幾次了&#xff0c;合蓋后屏幕關閉但不休眠的問題每次都要網上找參差不齊的教程&#xff0c;麻煩死了&#xff0c;索性記錄一下方便以后復制粘貼。 使用root登錄 sudo -i修改系統配置文件編輯logind.conf文件&#xff1a; 打開終端&#xff0c;輸入以下命令以編輯log…

深入解析 Monkey OCR:本地化、多語言文本識別的利器與實踐指南

在信息爆炸的時代&#xff0c;從圖片、掃描文檔中高效提取結構化文本的需求日益迫切。OCR&#xff08;光學字符識別&#xff09;技術成為解決這一問題的核心工具。盡管市面上有 Abbyy FineReader、Adobe Acrobat 等商業巨頭&#xff0c;以及 Tesseract、PaddleOCR 等開源方案&a…

動態規劃法 - 53. 最大子數組和

什么是動態規劃法&#xff1f; 簡單說&#xff0c;動態規劃&#xff08;Dynamic Programming&#xff0c;簡稱 DP&#xff09; 是一種**「把復雜問題拆解成小問題&#xff0c;通過解決小問題來解決大問題」**的方法。 核心思路有兩個&#xff1a; 1.拆分問題&#xff1a;把原問…

STM32CUBEMX配置stm32工程

1.新建工程2.選擇芯片3.配置各種片上外設和時鐘4.創建工程5.根據文件內容進行修改工程注意&#xff1a;最好根據工程規范來做&#xff0c;因為有時我們需要更改配置并重新生成&#xff0c;如果不按規范來會導致部分代碼會被系統清除&#xff0c;在工程中中有很多成對的BEGIN和E…