復(fù)盤|2022.3每日一題
3.1題目 6. Z 字形變換
【直接構(gòu)造】因此對(duì)于矩陣第一行的非空字符,其對(duì)應(yīng)的idx均為t的倍數(shù),即idx 恒等于 0 (mod t)
3.2題目 564. 尋找最近的回文數(shù)
【模擬】分別計(jì)算出以下每一種可能的方案對(duì)應(yīng)的回文整數(shù),在其中找到與原數(shù)最近且不等于原數(shù)的數(shù)即為答案。1.用原數(shù)的前半部分替換后半部分得到的回文整數(shù)。2.用原數(shù)的前半部分加一后的結(jié)果替換后半部分得到的回文整數(shù)。3.用原數(shù)的前半部分減一后的結(jié)果替換后半部分得到的回文整數(shù)。4.為防止位數(shù)變化導(dǎo)致構(gòu)造的回文整數(shù)錯(cuò)誤,因此直接構(gòu)造999..999和100..001作為備選答案。
3.3題目 258. 各位相加
【數(shù)學(xué)】對(duì)num分類討論:num不是9的倍數(shù)時(shí),其數(shù)根即為num除以9的余數(shù);num是9的倍數(shù)時(shí)。如果num=0,則其數(shù)根是0;如果num>0,則各位相加的結(jié)果大于0,其數(shù)根也大于0,因此其數(shù)根是9。
3.4題目 2104. 子數(shù)組范圍和
【單調(diào)?!克凶訑?shù)組的最小值之和sumMin = Σ(minRight[i] - i) × (i - minLeft[i]) × nums[i],同理求得所有子數(shù)組的最大值之和sumMax。
3.5題目 521. 最長特殊序列 Ⅰ
【腦筋急轉(zhuǎn)彎】字符串的子序列的長度不會(huì)超過該字符串的長度。若子序列的長度等于字符串的長度,那么子序列就是該字符串。若兩字符串不相同,那么我們可以選擇較長的字符串作為最長特殊序列,顯然它不會(huì)是較短的字符串的子序列。特別地,當(dāng)兩字符串長度相同時(shí)(但不是同一字符串),我們?nèi)匀豢梢赃x擇其中的一個(gè)字符串作為最長特殊序列,它不會(huì)是另一個(gè)字符串的子序列。若兩字符串相同,那么任一字符串的子序列均會(huì)出現(xiàn)在兩個(gè)字符串中,此時(shí)應(yīng)返回-1。
3.6題目 2100. 適合打劫銀行的日子
【DP】依次檢測所有的日期,第i天前連續(xù)time天警衛(wèi)數(shù)目都是非遞增與第i天后連續(xù)tme天警衛(wèi)數(shù)目都是非遞減。只需要預(yù)先計(jì)算出第i天前警衛(wèi)數(shù)目連續(xù)非遞增的天數(shù)以及第1天后警衛(wèi)數(shù)目連續(xù)非遞減的天數(shù)即可判斷第i天是否適合打劫。
3.7題目 504. 七進(jìn)制數(shù)
【倒推 + 迭代】輸入num代表我們思路中的十進(jìn)制表示num_10,我們需要將還原出的num_7以字符串的形式返回。
3.8題目 2055. 蠟燭之間的盤子
【預(yù)處理 + 前綴和】對(duì)于每一個(gè)詢問,我們只需要找到給定區(qū)間內(nèi)最左側(cè)和最右側(cè)的兩個(gè)蠟燭,這樣兩個(gè)蠟燭之間的所有盤子都是符合條件的。
3.9題目 798. 得分最高的最小輪調(diào)
【差分?jǐn)?shù)組】遍歷數(shù)組nums的所有元素并更新差分?jǐn)?shù)組之后,遍歷數(shù)組dffs并計(jì)算前綴和,則每個(gè)下標(biāo)處的前綴和表示當(dāng)前輪調(diào)下標(biāo)處的得分。在遍歷過程中維護(hù)最大得分和最大得分的最小輪調(diào)下標(biāo),遍歷結(jié)束之后即可得到結(jié)果。
3.10題目 589. N 叉樹的前序遍歷
【遞歸】前序位置。
3.11題目 2049. 統(tǒng)計(jì)最高分的節(jié)點(diǎn)數(shù)目
【DFS】先用parents數(shù)組統(tǒng)計(jì)出每個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),然后使用深度優(yōu)先搜索來計(jì)算以每個(gè)節(jié)點(diǎn)為根結(jié)點(diǎn)的子樹的大小,同時(shí)計(jì)算每個(gè)節(jié)點(diǎn)的大小,作為深度優(yōu)先搜索的返回值,最后統(tǒng)計(jì)最大分?jǐn)?shù)出現(xiàn)的次數(shù)。在實(shí)現(xiàn)上,統(tǒng)計(jì)最大分?jǐn)?shù)出現(xiàn)的次數(shù)可以放到深度優(yōu)先搜索中完成,從而節(jié)省一部分空間。
3.12題目 590. N 叉樹的后序遍歷
【遞歸】后序位置。
3.13題目 393. UTF-8 編碼驗(yàn)證
【遍歷 + 位運(yùn)算】對(duì)于頭字節(jié),首先判斷頭字節(jié)和MASK1的按位與運(yùn)算結(jié)果是否為0。如果為0則當(dāng)前字符由1個(gè)字節(jié)組成。如果不為0則創(chuàng)建位掩碼mask并將初始值設(shè)為MASK1,每次計(jì)算頭字節(jié)和mask的按位與運(yùn)算結(jié)果,如果結(jié)果不為0則將mask除以2(可通過右移位運(yùn)算實(shí)現(xiàn))并重復(fù)該過程,直到結(jié)果為0,此時(shí)可得到當(dāng)前字符的字節(jié)數(shù)。
3.14題目 599. 兩個(gè)列表的最小索引總和
【哈希表】使用一個(gè)哈希表記錄st中每個(gè)餐廳對(duì)應(yīng)的索引下標(biāo),然后遍歷st2,如果st2中的餐廳存在于哈希表中,那么說明該餐廳是兩人共同喜愛的,計(jì)算它的索引和。如果該索引和比最小索引和小,則清空結(jié)果,將該餐廳加入結(jié)果中,該索引和作為最小索引和;如果該索引和等于最小索引和,則直接將該餐廳加入結(jié)果中。
3.15題目 2044. 統(tǒng)計(jì)按位或能得到最大值的子集數(shù)目
【位運(yùn)算】可以用一個(gè)長度為n比特的整數(shù)來表示不同的子集,在整數(shù)的二進(jìn)制表示中,n個(gè)比特的值代表了對(duì)數(shù)組不同元素的取舍。第i位值為1則表示該子集選取對(duì)應(yīng)元素,第i位值為0則表示該子集不選取對(duì)應(yīng)元素。求出每個(gè)子集的按位或的值,并計(jì)算取到最大值時(shí)的子集個(gè)數(shù)。
3.16題目 432. 全 O(1) 的數(shù)據(jù)結(jié)構(gòu)
【雙向鏈表 + 哈希表】結(jié)合雙向鏈表和哈希表來實(shí)現(xiàn),鏈表中的每個(gè)節(jié)點(diǎn)存儲(chǔ)一個(gè)字符串集合keys,和一個(gè)正整數(shù)count,表示eys中的字符串均出現(xiàn)count次。鏈表從頭到尾的每個(gè)節(jié)點(diǎn)的cout值單調(diào)遞增(但不一定連續(xù))。此外,每個(gè)節(jié)點(diǎn)還需存儲(chǔ)指向上一個(gè)節(jié)點(diǎn)的指針prev和指向下一個(gè)節(jié)點(diǎn)的指針next。
3.17題目 720. 詞典中最長的單詞
【哈希集合】將答案初始化為空字符串。使用哈希集合存儲(chǔ)所有符合要求的單詞,初始時(shí)將空字符串加入哈希集合。遍歷數(shù)組words,對(duì)于每個(gè)單詞,判斷當(dāng)前單詞去掉最后一個(gè)字母之后的前綴是否在哈希集合中,如果該前綴在哈希集合中則當(dāng)前單詞是符合要求的單詞,將當(dāng)前單詞加入哈希集合,并將答案更新為當(dāng)前單詞。
3.18題目 2043. 簡易銀行系統(tǒng)
【模擬】按題意模擬,tansfer操作、deposit操作、withdraw操作。
3.19題目 606. 根據(jù)二叉樹創(chuàng)建字符串
【遞歸】遞歸得到二叉樹的前序遍歷,并在遞歸時(shí)加上額外的括號(hào)。
3.20題目 2039. 網(wǎng)絡(luò)空閑的時(shí)刻
【BFS】將整個(gè)計(jì)算機(jī)網(wǎng)絡(luò)視為一個(gè)無向圖,服務(wù)器為圖中的節(jié)點(diǎn)。根據(jù)圖中的邊對(duì)應(yīng)的關(guān)系edges即可求出圖中任意節(jié)點(diǎn)之間的最短距離。利用廣度優(yōu)先搜索求出節(jié)點(diǎn)0到其他節(jié)點(diǎn)的最短距離,然后依次求出每個(gè)節(jié)點(diǎn)變?yōu)榭臻e的時(shí)間,當(dāng)所有節(jié)點(diǎn)都變?yōu)榭臻e時(shí),整個(gè)網(wǎng)絡(luò)即變空閑狀態(tài),因此網(wǎng)絡(luò)的最早空閑時(shí)間即為各個(gè)節(jié)點(diǎn)中最晚的空閑時(shí)間。定義節(jié)點(diǎn)的空閑狀態(tài)定義為該節(jié)點(diǎn)不再發(fā)送和接收消息。
3.21題目 653. 兩數(shù)之和 IV - 輸入二叉搜索樹
【BFS + 哈希表】用深度優(yōu)先搜索的方式遍歷整棵樹,用哈希表記錄遍歷過的節(jié)點(diǎn)的值。對(duì)于一個(gè)值為x的節(jié)點(diǎn),我們檢查哈希表中是否存在k一x即可。如果存在對(duì)應(yīng)的元素,那么我們就可以在該樹上找到兩個(gè)節(jié)點(diǎn)的和為k;否則,我們將x放入到哈希表中。如果遍歷完整棵樹都不存在對(duì)應(yīng)的元素,那么該樹上不存在兩個(gè)和為k的節(jié)點(diǎn)。
3.22題目 2038. 如果相鄰兩個(gè)顏色均相同則刪除當(dāng)前顏色
【貪心】當(dāng)Alice的操作數(shù)大于Bob的操作數(shù)時(shí),Alice獲勝;否則,Bob獲勝。
3.23題目 440. 字典序的第K小數(shù)字
【字典樹思想】前序遍歷該字典樹即可得到字典序從小到大的數(shù)字序列,遍歷到第k個(gè)節(jié)點(diǎn)即為第k小的數(shù)字。
3.24題目 661. 圖片平滑器
【遍歷】依次計(jì)算每一個(gè)位置平滑處理后的結(jié)果即可。
3.25題目 172. 階乘后的零
【數(shù)學(xué)】n!尾零的數(shù)量即為n!中因子10的個(gè)數(shù),而10=2×5,因此轉(zhuǎn)換成求n!中質(zhì)因子2的個(gè)數(shù)和質(zhì)因子5的個(gè)數(shù)的較小值。
3.26題目 682. 棒球比賽
【模擬】用變長數(shù)組對(duì)棧進(jìn)行模擬。
3.27題目 2028. 找出缺失的觀測數(shù)據(jù)
【模擬構(gòu)造】構(gòu)造一種符合要求的答案:在缺失的n個(gè)觀測數(shù)據(jù)中,有remainder個(gè)觀測數(shù)據(jù)是quotient-+1,其余觀測數(shù)據(jù)都是quotient。
3.28題目 693. 交替位二進(jìn)制數(shù)
【模擬】從最低位至最高位,我們用對(duì)2取模再除以2的方法,依次求出輸入的二進(jìn)制表示的每一位,并與前一位進(jìn)行比較。如果相同,則不符合條件;如果每次比較都不相同,則符合條件。
3.29題目 2024. 考試的最大困擾度
【滑動(dòng)窗口】使用滑動(dòng)窗口的方法,從左到右枚舉右端點(diǎn),維護(hù)區(qū)間中另一種字符的數(shù)量為sum,當(dāng)sum超過k,我們需要讓左端點(diǎn)右移,直到sum≤k。移動(dòng)過程中,我們記錄滑動(dòng)窗口的最大長度,即為指定字符的最大連續(xù)數(shù)目。
3.30題目 1606. 找到處理最多請(qǐng)求的服務(wù)器
【模擬 + 有序集合 + 優(yōu)先隊(duì)列】將空閑服務(wù)器的編號(hào)都放入一個(gè)有序集合available中,將正在處理請(qǐng)求的服務(wù)器的處理結(jié)束時(shí)間和編號(hào)都放入一個(gè)優(yōu)先隊(duì)列busy中,優(yōu)先隊(duì)列滿足隊(duì)首的服務(wù)器的處理結(jié)束時(shí)間最小,用一個(gè)數(shù)組requests記錄對(duì)應(yīng)服務(wù)器處理的請(qǐng)求數(shù)目。
3.31題目 728. 自除數(shù)
【直接判斷】遍歷范圍[left,right]內(nèi)的所有整數(shù),分別判斷每個(gè)整數(shù)是否為自除數(shù)。