優選算法的巧思之徑:模擬專題

專欄:算法的魔法世界

個人主頁:手握風云

目錄

一、模擬

二、例題講解

2.1.?替換所有的問號

2.2.?提莫攻擊

2.3.?Z字形變換

2.4.?外觀數列

2.5.?數青蛙


一、模擬

? ? ? ? 模擬算法說簡單點就是照葫蘆畫瓢,現在草稿紙上模擬一遍算法過程,再把算法過程轉化為代碼。

二、例題講解

2.1.?替換所有的問號

? ? ? ? 方法中所給的字符串s只含小寫字母和問號,我們需要把這個問號轉化為某個小寫字母,得到一個連續重復字符的新字符串。

? ? ? ? 我們先將字符串轉化為字符數組,然后從前遍歷這個字符數組。當遇到"?"時,從26個英文字母找到第一個既不等與它的前一位有不等于它的后一位的字符。當我們還需要注意一下邊界情況,比如"?"在數組的第0位上,前一位不存在,只需要比較后面一位即可。

? ? ? ? 完整代碼實現:

class Solution {public String modifyString(String s) {char[] ch = s.toCharArray();int n = s.length();for (int i = 0; i < n; i++) {if(ch[i] == '?'){for(char c = 'a';c <= 'z';c++){if((i == 0 || c != ch[i - 1]) && (i == n - 1 || c != ch[i+1])){ch[i] = c;break;}}}}return String.valueOf(ch);}
}

2.2.?提莫攻擊

? ? ? ? 艾希受到提莫的攻擊,會對艾希造成持續兩秒的中毒效果,如果在中毒期間再次受到攻擊,那么中毒時間還會重置,題目要求我們輸出中毒的總時長。

? ? ? ? ·我們需要遍歷一邊數組,計算每兩個相鄰元素的差x,如果x大于等于中毒持續時間duration,則中毒時間ret加上duration;如果x小于duration,則ret直接加上x。但比較容易忽略的一點是數組的最后一個元素沒有下一個元素,所以最后的返回值再要加上一個duration。

? ? ? ? 完整代碼實現:

class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int ret = 0;for (int i = 1; i < timeSeries.length; i++) {int x = timeSeries[i] - timeSeries[i - 1];if(x >= duration) ret += duration;else ret += x;}return ret + duration;}
}

2.3.?Z字形變換

? ? ? ? 題目要求我們將給定的字符串變為倒Z排列,然后再以從左到右的順序輸出,得到一個新字符串。我們要想成功模擬出這個過程,需要借助一個矩陣來儲存字符。我們以示例1為例,先創建一個n行的矩陣,先向下填充,當x=n時,開始右上填充,當x=0時,又開始向下填充……。假設字符串長度為len,因為我們記得遍歷字符串又得遍歷矩陣,所以時間復雜度和空間復雜度都為O(len*n)

? ? ? ? 我們接下來可以通過找規律來對算法進行優化。如果矩陣里面填充的是字符的下標,那我們就可以發現規律了。第0行和第n-1行的數字正好構成了等差數列,且公差d為2n-2。接下來枚舉第1行到第n-1行,1、5、9、13依然是構成了等差數列,3、7、11構成等差數列,(1,3)->(5,7)->(9,11)。

? ? ? ? 完整代碼:

class Solution {public String convert(String s, int numRows) {//處理一下邊界情況if(numRows == 1) return s;int d = 2 * numRows - 2, n = s.length();StringBuilder ret = new StringBuilder();//1.處理第一行for (int i = 0; i < n; i += d)ret.append(s.charAt(i));//2.處理中間行for (int k = 1; k < numRows - 1; k++) {//一次枚舉中間行for (int i = k, j = d - i; i < n || j < n; i += d, j += d) {if (i < n) ret.append(s.charAt(i));if (j < n) ret.append(s.charAt(j));}}//3.處理最后一行for (int i = numRows - 1; i < n; i += d) {ret.append(s.charAt(i));}return ret.toString();}
}

2.4.?外觀數列

? ? ? ? 本題的輸出結果就是對第n-1的解釋,當n=1時,字符串s="1";當n=2時,前一項是1個1,記為"11";當n=3時,前一項是2個1,記為"21";當n=4時,前一項時1個2和1個1,記為"1211"……規律就是對上一項連續相同的字符元素進行分類。

? ? ? ? 我們可以利用雙指針進行模擬。先初始化兩個指針left和right,比較left和right是否相等,相等right就向右移動,當right的指向與left不相等時,right就停止,此時的left直接移動到right的位置。以此循環,直到right移動到字符串的結尾的后一位。前一類元素個數的計算right-1-left+1,作為對上一類元素的解釋。

? ? ? ? 完整代碼實現:

class Solution {public String countAndSay(int n) {String ret = "1";//先初始化n=1時的字符串for (int i = 1; i < n; i++) {StringBuilder tmp = new StringBuilder();int len = ret.length();for (int left = 0,right = 0;right < len;){while(right < len && (ret.charAt(left) == ret.charAt(right))) right++;tmp.append(Integer.toString(right - left));tmp.append(ret.charAt(left));left = right;}ret = tmp.toString();}return ret;}
}

2.5.?數青蛙

????????題目要求我們根據給定的字符串,計算出最少需要多少只青蛙才能完成鳴叫的過程。鳴叫的過程必須按照"croak"的順序進行。比如"croakcroak",一只青蛙先叫完1聲,還可以接著叫第2聲;"crcoakroak","cr"后面是"c",就需要另一只青蛙開始叫。

? ? ? ? 我們先從頭到尾遍歷一遍字符串,,比如我們遍歷到a時,只需確定a的前面是不是r,所以我們還需要一個哈希表來記錄每個字符出現的情況。當遍歷到c時,哈希表中c加1;如果遍歷到r時,檢查前一個是不是c,如果是,則c--,r++。重復以上操作,

? ? ? ? 如上圖,k后面又是c,我們還需要給c記錄上1,而我們要求的是所需不同青蛙的最少數目,所以我們從k里面借一個1,再去遍歷最后一個"croak",最終k里面存的就是最終結果。當遍歷完字符串之后,k前面還有非0元素,說明還有青蛙沒有叫完,則返回-1。

? ? ? ? 還有一種情況,如果給定的字符串是"crroak",遍歷到第二個r時,哈希表中的c為0,直接返回-1。所以我們可以總結出:當r、o、a、k的前驅字符再哈希表時,前驅個數--,當前字符++,不存在直接返回-1;如果是c,找k是否存在于哈希表中,存在前驅個數--,當前字符++,不存在直接返回-1。

????????完整代碼實現:

class Solution {public int minNumberOfFrogs(String croakOfFrogs) {char[] croakOf = croakOfFrogs.toCharArray();String t = "croak";int n = t.length();int[] hash = new int[5];Map<Character,Integer> index = new HashMap<>();for (int i = 0; i < n; i++)index.put(t.charAt(i),i);for (char ch : croakOf) {if(ch == t.charAt(0)) {if(hash[n - 1] != 0) hash[n - 1]--;hash[0]++;}else {int i = index.get(ch);if (hash[i - 1] == 0) return -1;hash[i - 1]--;hash[i]++;}}for (int i = 0; i < n - 1; i++) {if(hash[i] != 0)return -1;}return hash[n - 1];}
}

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

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

相關文章

貪心算法(13)(java)合并區間

題目&#xff1a; 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff…

A股復權計算_權息數據整理

目錄 前置&#xff1a; 步驟&#xff1a; 1 以通達信為參照 2 從優礦獲取所需數據 2.1 股票配股信息 2.2 股票分紅信息 2.3 股票拆股信息 3 合并數據&#xff0c;制成權息數據表 權息數據截止20250329.7z 視頻 前置&#xff1a; 1 本系列將以 “A股復權計算_” 開頭…

學習筆記—數據結構—二叉樹(鏈式)

目錄 二叉樹&#xff08;鏈式&#xff09; 概念 結構 初始化 遍歷 前序遍歷 中序遍歷 后序遍歷 層序遍歷 結點個數 葉子結點個數 第k層結點個數 深度/高度 查找值為x的結點 銷毀 判斷是否為完整二叉樹 總結 頭文件Tree.h Tree.c 測試文件test.c 補充文件Qu…

Open GL ES ->GLSurfaceView在正交投影下的圖片旋轉、縮放、位移

XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…

Day78 | 靈神 | 反轉鏈表 兩兩交換鏈表中的節點

Day78 | 靈神 | 反轉鏈表 兩兩交換鏈表中的節點 24.兩兩交換鏈表中的節點 24. 兩兩交換鏈表中的節點 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 這道題就是下面這道題的k2的情況 25. K 個一組翻轉鏈表 - 力扣&#xff08;LeetCode&#xff09; 基本思路和…

濾波---卡爾曼濾波

卡爾曼濾波概覽 一、定義 卡爾曼濾波是一種基于線性系統和高斯噪聲假設的遞歸最優狀態估計算法。其核心目標是通過融合系統模型預測值與傳感器測量值&#xff0c;在噪聲環境中實時估計系統的動態狀態&#xff08;如位置、速度、加速度等&#xff09;。 數學基礎&#xff1a; …

23種設計模式-結構型模式-橋接器

文章目錄 簡介問題解決方案示例總結 簡介 橋接器是一種結構型設計模式&#xff0c;可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構&#xff0c;從而能在開發時分別使用。 問題 假如你有一個幾何形狀Shape類&#xff0c;它有兩個子類&#xff1a;圓形C…

手工排查后門木馬的常用姿勢

聲明&#xff01;本文章所有的工具分享僅僅只是供大家學習交流為主&#xff0c;切勿用于非法用途&#xff0c;如有任何觸犯法律的行為&#xff0c;均與本人及團隊無關&#xff01;&#xff01;&#xff01; 1. 檢查異常文件 &#xff08;1&#xff09;查找最近修改的文件 # 查…

工業機器人核心算法體系解析:從感知到決策的技術演進

工業機器人作為智能制造的核心裝備,其技術競爭力的本質是算法體系的優化與創新。從靜態軌跡執行到動態環境適應,從單一任務控制到復雜場景決策,工業機器人的算法體系涵蓋環境感知、運動控制、路徑規劃、行為決策四大核心模塊。本文將深入解析各模塊的關鍵算法及其技術演進,…

當 EcuBus-Pro + UTA0401 遇上 NSUC1500

文章目錄 1.前言2.EcuBus-Pro簡介2.1 官方地址2.2 概覽 3.納芯微NSUC1500簡介3.1 NSUC1500概述3.2 產品特性 4.測試環境5.基礎功能5.1 數據發送5.2 數據監控 6.自動化功能6.1 腳本創建6.2 腳本編輯6.3 腳本編輯與測試 7.音樂律動7.1 導入例程7.2 效果展示 ECB工程 1.前言 最近…

說說Redis的內存淘汰策略?

大家好&#xff0c;我是鋒哥。今天分享關于【說說Redis的內存淘汰策略?】面試題。希望對大家有幫助&#xff1b; 說說Redis的內存淘汰策略? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Redis的內存淘汰策略用于管理當內存達到最大限制時&#xff0c;如何處理過…

Python實現音頻數字水印方法

數字水印技術可以將隱藏信息嵌入到音頻文件中而不明顯影響音頻質量。下面我將介紹幾種在Python中實現音頻數字水印的方法。 方法一&#xff1a;LSB (最低有效位) 水印 import numpy as np from scipy.io import wavfile def embed_watermark_lsb(audio_path, watermark, ou…

Altium Designer 24 PCB 走線倒圓弧方法

Altium Designer 24 PCB 走線倒圓弧方法 問題描述解決方法設置倒圓弧參數選擇需要優化的走線進行走線優化 優化效果展示 在 PCB 設計中&#xff0c;走線轉角過于尖銳不僅影響美觀&#xff0c;還可能引起信號完整性問題。本文介紹如何在 Altium Designer 24 中通過倒圓弧優化走線…

Cookie與Token詳解及測試需重點關注點

在現代Web應用中&#xff0c;Cookie 和 Token 是兩種常見的身份驗證與會話管理機制。它們分別在不同的場景下扮演著重要的角色&#xff0c;在性能、靈活性和安全性方面具有各自的特點。作為測試人員&#xff0c;理解它們的工作原理以及如何對其進行有效的測試&#xff0c;是保證…

Unity 2022.3.x部分Android設備播放視頻黑屏問題

Android平臺視頻兼容性問題很多…類似的黑屏問題真的很頭大&#xff0c;總結一些常見問題&#xff1a; 1. 視頻文件不支持壓縮 如果使用AssetBundle加載視頻&#xff0c;這個AssetBundle壓縮格式要選None。有人可能會說最新版Unity已經支持bundle壓縮下播放視頻&#xff0c;穩…

Redis - 概述

目錄 ?編輯 一、什么是redis 二、redis能做什么&#xff08;有什么特點&#xff09;&#xff1f; 三、redis有什么優勢 四、Redis與其他key-value存儲有什么不同 五、Redis命令 六、Redis數據結構 1、基礎數據結構 2、高級數據結構 一、什么是redis 1、redis&#x…

數據庫部署在服務器表不存在解決方案

MySQL 數據庫表不存在錯誤解決方案 MySqlException (0x80004005): Table store.SysLogOperate doesnt exist 服務器用的mysql5.6 用這個表syslogoperate只是全是小寫 看起來你在使用 Pomelo.EntityFrameworkCore.MySql 作為 MySQL 數據庫的提供程序&#xff0c;并且在初始化…

圖靈完備——游戲中進行實踐

圖靈完備 簡述結構一、基本邏輯電路1、低電平2、高電平3、非門4、與門5、三路與門6、或門7、三路或門8、與非門9、或非門10、異或門11、同或門 二、算數運算&&存儲器1、二進制速算2、成對的麻煩 簡述 這周就要學習計算機組成原理了&#xff0c;為了學起來不那么吃力&am…

踏過強化學習的每一步推導

給定 l [ a n , . . . , a 0 ] l[a_n, ..., a_0] l[an?,...,a0?]&#xff0c;現在 for idx in range(len(l)-2, -1, -1):l[idx] l[idx1] * ld注&#xff1a;這里的ld就是 λ \lambda λ&#xff0c;定義 λ 0 1 \lambda^01 λ01 證明變換后&#xff1a; l [ ∑ i 0 n …

AI小白的第七天:必要的數學知識(概率)

概率 Probability 1. 概率的定義 概率是一個介于 0 和 1 之間的數&#xff0c;表示某個事件發生的可能性&#xff1a; 0&#xff1a;事件不可能發生。1&#xff1a;事件必然發生。0 到 1 之間&#xff1a;事件發生的可能性大小。 例如&#xff0c;擲一枚公平的硬幣&#xf…