LeetCode 第 201 场周赛(304/5614,前5.42%)
文章目錄
- 1. 比賽結果
- 2. 題目
- 1. LeetCode 5483. 整理字符串 easy
- 2. LeetCode 5484. 找出第 N 個二進制字符串中的第 K 位 medium
- 3. LeetCode 5471. 和為目標值的最大數目不重疊非空子數組數目 medium
- 4. LeetCode 5486. 切棍子的最小成本 hard
1. 比賽結果
做出來3題,第二題暴力可以過,我想著不行,找規律失敗。繼續加油!
全國排名: 304 / 5614,5.42%;全球排名: 956 / 15616,6.12%
2. 題目
1. LeetCode 5483. 整理字符串 easy
題目鏈接
給你一個由大小寫英文字母組成的字符串 s 。
一個整理好的字符串中,兩個相鄰字符 s[i] 和 s[i + 1] 不會同時滿足下述條件:
- 0 <= i <= s.length - 2
- s[i] 是小寫字符,但 s[i + 1] 是相同的大寫字符;反之亦然 。
請你將字符串整理好,每次你都可以從字符串中選出滿足上述條件的 兩個相鄰 字符并刪除,直到字符串整理好為止。
請返回整理好的 字符串 。題目保證在給出的約束條件下,測試樣例對應的答案是唯一的。
注意:空字符串也屬于整理好的字符串,盡管其中沒有任何字符。
示例 1: 輸入:s = "leEeetcode" 輸出:"leetcode" 解釋:無論你第一次選的是 i = 1 還是 i = 2, 都會使 "leEeetcode" 縮減為 "leetcode" 。示例 2: 輸入:s = "abBAcC" 輸出:"" 解釋:存在多種不同情況,但所有的情況都會導致相同的結果。例如: "abBAcC" --> "aAcC" --> "cC" --> "" "abBAcC" --> "abBA" --> "aA" --> ""示例 3: 輸入:s = "s" 輸出:"s"提示: 1 <= s.length <= 100 s 只包含小寫和大寫英文字母解題:
- 使用棧解題
2. LeetCode 5484. 找出第 N 個二進制字符串中的第 K 位 medium
題目鏈接
給你兩個正整數 n 和 k,二進制字符串 Sn 的形成規則如下:
- S1 = "0"
- 當 i > 1 時,Si = Si-1 + "1" + reverse(invert(Si-1))
其中 + 表示串聯操作,reverse(x) 返回反轉 x 后得到的字符串,而 invert(x) 則會翻轉 x 中的每一位(0 變為 1,而 1 變為 0)
例如,符合上述描述的序列的前 4 個字符串依次是:
S1 = "0" S2 = "011" S3 = "0111001" S4 = "011100110110001"請你返回 Sn 的 第 k 位字符 ,題目數據保證 k 一定在 Sn 長度范圍以內。
示例 1: 輸入:n = 3, k = 1 輸出:"0" 解釋:S3 為 "0111001",其第 1 位為 "0" 。示例 2: 輸入:n = 4, k = 11 輸出:"1" 解釋:S4 為 "011100110110001",其第 11 位為 "1" 。示例 3: 輸入:n = 1, k = 1 輸出:"0"示例 4: 輸入:n = 2, k = 3 輸出:"1"提示: 1 <= n <= 20 1 <= k <= 2^n - 1解題:
- 比賽沒想著暴力法,暴力很簡單
循環解法:
class Solution { public:char findKthBit(int n, int k) {if(k==1 || n==1)return '0';k--;int len = (1<<n)-1;//字符串長度為2^n-1if(k == len/2) return '1';bool reverse = false;while(n) {len = (1<<n)-1;//字符串長度為2^n-1if(k == 0)//找到最前面了,狀態不會再變break;else if(k > len/2) {reverse = !reverse;//后半部分會反轉狀態k = len-1-k;//位置對應于前一個字符的位置}n--;}return reverse ? '1' : '0';} };遞歸解法
class Solution { public:char findKthBit(int n, int k) {if(k==1 || n==1)return '0';k--;int len = (1<<n)-1;//字符串長度為2^n-1if(k == len/2) return '1';return dfs(n, k);}char dfs(int n, int k){if(n==1 || k == 0)return '0';int len = (1<<n)-1;if(k == len/2) return '1';if(k > len/2) return dfs(n-1, len-1-k)=='1' ? '0' : '1';return dfs(n-1, k);} };3. LeetCode 5471. 和為目標值的最大數目不重疊非空子數組數目 medium
題目鏈接
給你一個數組 nums 和一個整數 target 。
請你返回 非空不重疊 子數組的最大數目,且每個子數組中數字和都為 target 。
示例 1: 輸入:nums = [1,1,1,1,1], target = 2 輸出:2 解釋:總共有 2 個不重疊子數組(加粗數字表示) [1,1,1,1,1] , 它們的和為目標值 2 。示例 2: 輸入:nums = [-1,3,5,1,4,2,-9], target = 6 輸出:2 解釋:總共有 3 個子數組和為 6 。 ([5,1], [4,2], [3,5,1,4,2,-9]) 但只有前 2 個是不重疊的。示例 3: 輸入:nums = [-2,6,6,3,5,4,1,2,8], target = 10 輸出:3示例 4: 輸入:nums = [0,0,0], target = 0 輸出:3提示: 1 <= nums.length <= 10^5 -10^4 <= nums[i] <= 10^4 0 <= target <= 10^6解題:
- 使用哈希記錄狀態,貪心,找到一個存在狀態,子數組+1,哈希清空(題目要求無重復的子數組)
4. LeetCode 5486. 切棍子的最小成本 hard
題目鏈接
有一根長度為 n 個單位的木棍,棍上從 0 到 n 標記了若干位置。例如,長度為 6 的棍子可以標記如下:
給你一個整數數組 cuts ,其中 cuts[i] 表示你需要將棍子切開的位置。
你可以按順序完成切割,也可以根據需要更改切割的順序。
每次切割的成本都是當前要切割的棍子的長度,切棍子的總成本是歷次切割成本的總和。
對棍子進行切割將會把一根木棍分成兩根較小的木棍(這兩根木棍的長度和就是切割前木棍的長度)。請參閱第一個示例以獲得更直觀的解釋。
返回切棍子的 最小總成本 。
示例 1:
解題:
- 區間DP
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 第 201 场周赛(304/5614,前5.42%)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1067. 范围内的数
- 下一篇: 天池 在线编程 中位数