1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-10-19 12:06:48 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2022-04-03 22:51:40 +08:00
parent 9930064684
commit 55953eb844
45 changed files with 15179 additions and 11069 deletions

View File

@@ -0,0 +1,62 @@
<p>给你一个字符数组 <code>keys</code> ,由若干 <strong>互不相同</strong> 的字符组成。还有一个字符串数组 <code>values</code> ,内含若干长度为 2 的字符串。另给你一个字符串数组 <code>dictionary</code> ,包含解密后所有允许的原字符串。请你设计并实现一个支持加密及解密下标从 <strong>0</strong> 开始字符串的数据结构。</p>
<p>字符串 <strong>加密</strong> 按下述步骤进行:</p>
<ol>
<li>对字符串中的每个字符 <code>c</code> ,先从 <code>keys</code> 中找出满足 <code>keys[i] == c</code> 的下标 <code>i</code></li>
<li>在字符串中,用&nbsp;<code>values[i]</code> 替换字符 <code>c</code></li>
</ol>
<p>字符串 <strong>解密</strong> 按下述步骤进行:</p>
<ol>
<li>将字符串每相邻 2 个字符划分为一个子字符串,对于每个子字符串 <code>s</code> ,找出满足 <code>values[i] == s</code> 的一个下标 <code>i</code> 。如果存在多个有效的 <code>i</code> ,从中选择 <strong>任意</strong> 一个。这意味着一个字符串解密可能得到多个解密字符串。</li>
<li>在字符串中,用 <code>keys[i]</code> 替换 <code>s</code></li>
</ol>
<p>实现 <code>Encrypter</code> 类:</p>
<ul>
<li><code>Encrypter(char[] keys, String[] values, String[] dictionary)</code><code>keys</code><code>values</code><code>dictionary</code> 初始化 <code>Encrypter</code> 类。</li>
<li><code>String encrypt(String word1)</code> 按上述加密过程完成对 <code>word1</code> 的加密,并返回加密后的字符串。</li>
<li><code>int decrypt(String word2)</code> 统计并返回可以由 <code>word2</code> 解密得到且出现在 <code>dictionary</code> 中的字符串数目。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例:</strong></p>
<pre>
<strong>输入:</strong>
["Encrypter", "encrypt", "decrypt"]
[[['a', 'b', 'c', 'd'], ["ei", "zf", "ei", "am"], ["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]], ["abcd"], ["eizfeiam"]]
<strong>输出:</strong>
[null, "eizfeiam", 2]
<strong>解释:</strong>
Encrypter encrypter = new Encrypter([['a', 'b', 'c', 'd'], ["ei", "zf", "ei", "am"], ["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]);
encrypter.encrypt("abcd"); // 返回 "eizfeiam"。
&nbsp; // 'a' 映射为 "ei"'b' 映射为 "zf"'c' 映射为 "ei"'d' 映射为 "am"。
encrypter.decrypt("eizfeiam"); // return 2.
// "ei" 可以映射为 'a' 或 'c'"zf" 映射为 'b'"am" 映射为 'd'。
// 因此,解密后可以得到的字符串是 "abad""cbad""abcd" 和 "cbcd"。
// 其中 2 个字符串,"abad" 和 "abcd",在 dictionary 中出现,所以答案是 2 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= keys.length == values.length &lt;= 26</code></li>
<li><code>values[i].length == 2</code></li>
<li><code>1 &lt;= dictionary.length &lt;= 100</code></li>
<li><code>1 &lt;= dictionary[i].length &lt;= 100</code></li>
<li>所有 <code>keys[i]</code><code>dictionary[i]</code> <strong>互不相同</strong></li>
<li><code>1 &lt;= word1.length &lt;= 2000</code></li>
<li><code>1 &lt;= word2.length &lt;= 200</code></li>
<li>所有 <code>word1[i]</code> 都出现在 <code>keys</code></li>
<li><code>word2.length</code> 是偶数</li>
<li><code>keys</code><code>values[i]</code><code>dictionary[i]</code><code>word1</code><code>word2</code> 只含小写英文字母</li>
<li>至多调用 <code>encrypt</code><code>decrypt</code> <strong>总计</strong> <code>200</code></li>
</ul>

View File

@@ -0,0 +1,54 @@
<p>给你一个整数数组 <code>matches</code> 其中 <code>matches[i] = [winner<sub>i</sub>, loser<sub>i</sub>]</code> 表示在一场比赛中 <code>winner<sub>i</sub></code> 击败了 <code>loser<sub>i</sub></code></p>
<p>返回一个长度为 2 的列表<em> </em><code>answer</code> </p>
<ul>
<li><code>answer[0]</code> 是所有 <strong>没有</strong> 输掉任何比赛的玩家列表。</li>
<li><code>answer[1]</code> 是所有恰好输掉 <strong>一场</strong> 比赛的玩家列表。</li>
</ul>
<p>两个列表中的值都应该按 <strong>递增</strong> 顺序返回。</p>
<p><strong>注意:</strong></p>
<ul>
<li>只考虑那些参与 <strong>至少一场</strong> 比赛的玩家。</li>
<li>生成的测试用例保证 <strong>不存在</strong> 两场比赛结果 <strong>相同</strong></li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>matches = [[1,3],[2,3],[3,6],[5,6],[5,7],[4,5],[4,8],[4,9],[10,4],[10,9]]
<strong>输出:</strong>[[1,2,10],[4,5,7,8]]
<strong>解释:</strong>
玩家 1、2 和 10 都没有输掉任何比赛。
玩家 4、5、7 和 8 每个都输掉一场比赛。
玩家 3、6 和 9 每个都输掉两场比赛。
因此answer[0] = [1,2,10] 和 answer[1] = [4,5,7,8] 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>matches = [[2,3],[1,3],[5,4],[6,4]]
<strong>输出:</strong>[[1,2,5,6],[]]
<strong>解释:</strong>
玩家 1、2、5 和 6 都没有输掉任何比赛。
玩家 3 和 4 每个都输掉两场比赛。
因此answer[0] = [1,2,5,6] 和 answer[1] = [] 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= matches.length &lt;= 10<sup>5</sup></code></li>
<li><code>matches[i].length == 2</code></li>
<li><code>1 &lt;= winner<sub>i</sub>, loser<sub>i</sub> &lt;= 10<sup>5</sup></code></li>
<li><code>winner<sub>i</sub> != loser<sub>i</sub></code></li>
<li>所有 <code>matches[i]</code> <strong>互不相同</strong></li>
</ul>

View File

@@ -0,0 +1,41 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>nums</code>&nbsp;,其中&nbsp;<code>nums[i]</code>&nbsp;<code>0</code>&nbsp;<code>9</code>&nbsp;之间(两者都包含)的一个数字。</p>
<p><code>nums</code>&nbsp;<strong>三角和</strong>&nbsp;是执行以下操作以后最后剩下元素的值:</p>
<ol>
<li><code>nums</code>&nbsp;初始包含&nbsp;<code>n</code>&nbsp;个元素。如果&nbsp;<code>n == 1</code>&nbsp;<strong>终止</strong>&nbsp;操作。否则,<strong>创建</strong>&nbsp;一个新的下标从&nbsp;<strong>0</strong>&nbsp;开始的长度为 <code>n - 1</code>&nbsp;的整数数组&nbsp;<code>newNums</code>&nbsp;</li>
<li>对于满足&nbsp;<code>0 &lt;= i &lt;&nbsp;n - 1</code>&nbsp;的下标&nbsp;<code>i</code>&nbsp;<code>newNums[i]</code> <strong>赋值</strong>&nbsp;&nbsp;<code>(nums[i] + nums[i+1]) % 10</code>&nbsp;<code>%</code>&nbsp;表示取余运算。</li>
<li>&nbsp;<code>newNums</code>&nbsp;<strong>替换</strong> 数组&nbsp;<code>nums</code>&nbsp;</li>
<li>从步骤 1 开始&nbsp;<strong>重复</strong>&nbsp;整个过程。</li>
</ol>
<p>请你返回&nbsp;<code>nums</code>&nbsp;的三角和。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/02/22/ex1drawio.png" style="width: 250px; height: 250px;" /></p>
<pre>
<b>输入:</b>nums = [1,2,3,4,5]
<b>输出:</b>8
<strong>解释:</strong>
上图展示了得到数组三角和的过程。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [5]
<b>输出:</b>5
<b>解释:</b>
由于 nums 中只有一个元素,数组的三角和为这个元素自己。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 1000</code></li>
<li><code>0 &lt;= nums[i] &lt;= 9</code></li>
</ul>

View File

@@ -0,0 +1,46 @@
<p>你需要从空字符串开始&nbsp;<strong>构造</strong> 一个长度为 <code>n</code>&nbsp;的字符串 <code>s</code>&nbsp;,构造的过程为每次给当前字符串 <strong>前面</strong>&nbsp;添加 <strong>一个</strong> 字符。构造过程中得到的所有字符串编号为 <code>1</code>&nbsp;<code>n</code>&nbsp;,其中长度为 <code>i</code>&nbsp;的字符串编号为 <code>s<sub>i</sub></code>&nbsp;</p>
<ul>
<li>比方说,<code>s = "abaca"</code>&nbsp;<code>s<sub>1</sub> == "a"</code>&nbsp;<code>s<sub>2</sub> == "ca"</code>&nbsp;<code>s<sub>3</sub> == "aca"</code>&nbsp;依次类推。</li>
</ul>
<p><code>s<sub>i</sub></code>&nbsp;<strong>得分</strong>&nbsp;&nbsp;<code>s<sub>i</sub></code>&nbsp;<code>s<sub>n</sub></code>&nbsp;<strong>最长公共前缀</strong> 的长度(注意&nbsp;<code>s == s<sub>n</sub></code>&nbsp;)。</p>
<p>给你最终的字符串&nbsp;<code>s</code>&nbsp;,请你返回每一个<em>&nbsp;</em><code>s<sub>i</sub></code>&nbsp;&nbsp;<strong>得分之和</strong>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>s = "babab"
<b>输出:</b>9
<b>解释:</b>
s<sub>1</sub> == "b" ,最长公共前缀是 "b" ,得分为 1 。
s<sub>2</sub> == "ab" ,没有公共前缀,得分为 0 。
s<sub>3</sub> == "bab" ,最长公共前缀为 "bab" ,得分为 3 。
s<sub>4</sub> == "abab" ,没有公共前缀,得分为 0 。
s<sub>5</sub> == "babab" ,最长公共前缀为 "babab" ,得分为 5 。
得分和为 1 + 0 + 3 + 0 + 5 = 9 ,所以我们返回 9 。</pre>
<p><strong>示例 2 </strong></p>
<pre>
<b>输入:</b>s = "azbazbzaz"
<b>输出:</b>14
<b>解释:</b>
s<sub>2</sub> == "az" ,最长公共前缀为 "az" ,得分为 2 。
s<sub>6</sub> == "azbzaz" ,最长公共前缀为 "azb" ,得分为 3 。
s<sub>9</sub> == "azbazbzaz" ,最长公共前缀为 "azbazbzaz" ,得分为 9 。
其他 s<sub>i</sub> 得分均为 0 。
得分和为 2 + 3 + 9 = 14 ,所以我们返回 14 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 10<sup>5</sup></code></li>
<li><code>s</code>&nbsp;只包含小写英文字母。</li>
</ul>

View File

@@ -0,0 +1,33 @@
<p>给你一个 <strong>下标从 0 开始</strong> 的整数数组 <code>candies</code> 。数组中的每个元素表示大小为 <code>candies[i]</code> 的一堆糖果。你可以将每堆糖果分成任意数量的 <strong>子堆</strong> ,但 <strong>无法</strong> 再将两堆合并到一起。</p>
<p>另给你一个整数 <code>k</code> 。你需要将这些糖果分配给 <code>k</code> 个小孩,使每个小孩分到 <strong>相同</strong> 数量的糖果。每个小孩可以拿走 <strong>至多一堆</strong> 糖果,有些糖果可能会不被分配。</p>
<p>返回每个小孩可以拿走的 <strong>最大糖果数目</strong><em> </em></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>candies = [5,8,6], k = 3
<strong>输出:</strong>5
<strong>解释:</strong>可以将 candies[1] 分成大小分别为 5 和 3 的两堆,然后把 candies[2] 分成大小分别为 5 和 1 的两堆。现在就有五堆大小分别为 5、5、3、5 和 1 的糖果。可以把 3 堆大小为 5 的糖果分给 3 个小孩。可以证明无法让每个小孩得到超过 5 颗糖果。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>candies = [2,5], k = 11
<strong>输出:</strong>0
<strong>解释:</strong>总共有 11 个小孩,但只有 7 颗糖果,但如果要分配糖果的话,必须保证每个小孩至少能得到 1 颗糖果。因此,最后每个小孩都没有得到糖果,答案是 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= candies.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= candies[i] &lt;= 10<sup>7</sup></code></li>
<li><code>1 &lt;= k &lt;= 10<sup>12</sup></code></li>
</ul>

View File

@@ -0,0 +1,36 @@
<p>给你两个字符串 <code>current</code><code>correct</code> ,表示两个 <strong>24 小时制时间</strong></p>
<p><strong>24 小时制时间</strong><code>"HH:MM"</code> 进行格式化,其中 <code>HH</code><code>00</code><code>23</code> 之间,而 <code>MM</code><code>00</code><code>59</code> 之间。最早的 24 小时制时间为 <code>00:00</code> ,最晚的是 <code>23:59</code></p>
<p>在一步操作中,你可以将 <code>current</code> 这个时间增加 <code>1</code><code>5</code><code>15</code><code>60</code> 分钟。你可以执行这一操作 <strong>任意</strong> 次数。</p>
<p>返回将&nbsp;<code>current</code><em> </em>转化为<em> </em><code>correct</code> 需要的 <strong>最少操作数</strong></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>current = "02:30", correct = "04:35"
<strong>输出:</strong>3
<strong>解释:
</strong>可以按下述 3 步操作将 current 转换为 correct
- 为 current 加 60 分钟current 变为 "03:30" 。
- 为 current 加 60 分钟current 变为 "04:30" 。
- 为 current 加 5 分钟current 变为 "04:35" 。
可以证明,无法用少于 3 步操作将 current 转化为 correct 。</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>current = "11:00", correct = "11:01"
<strong>输出:</strong>1
<strong>解释:</strong>只需要为 current 加一分钟,所以最小操作数是 1 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>current</code><code>correct</code> 都符合 <code>"HH:MM"</code> 格式</li>
<li><code>current &lt;= correct</code></li>
</ul>

View File

@@ -0,0 +1,40 @@
<p>一次 <strong>位翻转</strong>&nbsp;定义为将数字&nbsp;<code>x</code>&nbsp;二进制中的一个位进行 <strong>翻转</strong>&nbsp;操作,即将&nbsp;<code>0</code>&nbsp;变成&nbsp;<code>1</code>&nbsp;,或者将&nbsp;<code>1</code>&nbsp;变成&nbsp;<code>0</code>&nbsp;</p>
<ul>
<li>比方说,<code>x = 7</code>&nbsp;,二进制表示为&nbsp;<code>111</code>&nbsp;,我们可以选择任意一个位(包含没有显示的前导 0 )并进行翻转。比方说我们可以翻转最右边一位得到&nbsp;<code>110</code>&nbsp;,或者翻转右边起第二位得到&nbsp;<code>101</code>&nbsp;,或者翻转右边起第五位(这一位是前导 0 )得到&nbsp;<code>10111</code>&nbsp;等等。</li>
</ul>
<p>给你两个整数&nbsp;<code>start</code>&nbsp;<code>goal</code>&nbsp;,请你返回将&nbsp;<code>start</code>&nbsp;转变成&nbsp;<code>goal</code>&nbsp;&nbsp;<strong>最少位翻转</strong>&nbsp;次数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>start = 10, goal = 7
<b>输出:</b>3
<b>解释:</b>10 和 7 的二进制表示分别为 1010 和 0111 。我们可以通过 3 步将 10 转变成 7
- 翻转右边起第一位得到101<strong><em>0</em></strong> -&gt; 101<strong><em>1 。</em></strong>
- 翻转右边起第三位1<strong><em>0</em></strong>11 -&gt; 1<strong><em>1</em></strong>11 。
- 翻转右边起第四位:<strong><em>1</em></strong>111 -&gt; <strong><em>0</em></strong>111 。
我们无法在 3 步内将 10 转变成 7 。所以我们返回 3 。</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>start = 3, goal = 4
<b>输出:</b>3
<b>解释:</b>3 和 4 的二进制表示分别为 011 和 100 。我们可以通过 3 步将 3 转变成 4
- 翻转右边起第一位01<strong><em>1</em></strong> -&gt; 01<em><strong>0 </strong></em>
- 翻转右边起第二位0<strong><em>1</em></strong>0 -&gt; 0<strong><em>0</em></strong>0 。
- 翻转右边起第三位:<strong><em>0</em></strong>00 -&gt; <strong><em>1</em></strong>00 。
我们无法在 3 步内将 3 变成 4 。所以我们返回 3 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= start, goal &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,47 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的二进制字符串&nbsp;<code>s</code>&nbsp;,它表示一条街沿途的建筑类型,其中:</p>
<ul>
<li><code>s[i] = '0'</code>&nbsp;表示第&nbsp;<code>i</code>&nbsp;栋建筑是一栋办公楼,</li>
<li><code>s[i] = '1'</code>&nbsp;表示第&nbsp;<code>i</code>&nbsp;栋建筑是一间餐厅。</li>
</ul>
<p>作为市政厅的官员,你需要随机<strong>&nbsp;选择</strong>&nbsp;3 栋建筑。然而,为了确保多样性,选出来的 3 栋建筑 <strong>相邻</strong>&nbsp;的两栋不能是同一类型。</p>
<ul>
<li>比方说,给你&nbsp;<code>s = "0<em><strong>0</strong></em>1<em><strong>1</strong></em>0<em><strong>1</strong></em>"</code>&nbsp;,我们不能选择第&nbsp;<code>1</code>&nbsp;<code>3</code>&nbsp;&nbsp;<code>5</code>&nbsp;栋建筑,因为得到的子序列是&nbsp;<code>"0<em><strong>11</strong></em>"</code>&nbsp;,有相邻两栋建筑是同一类型,所以 <strong>不合</strong>&nbsp;题意。</li>
</ul>
<p>请你返回可以选择 3 栋建筑的 <strong>有效方案数</strong>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>s = "001101"
<b>输出:</b>6
<b>解释:</b>
以下下标集合是合法的:
- [0,2,4] ,从 "<em><strong>0</strong></em>0<em><strong>1</strong></em>1<em><strong>0</strong></em>1" 得到 "010"
- [0,3,4] ,从 "<em><strong>0</strong></em>01<em><strong>10</strong></em>1" 得到 "010"
- [1,2,4] ,从 "0<em><strong>01</strong></em>1<em><strong>0</strong></em>1" 得到 "010"
- [1,3,4] ,从 "0<em><strong>0</strong></em>1<em><strong>10</strong></em>1" 得到 "010"
- [2,4,5] ,从 "00<em><strong>1</strong></em>1<em><strong>01</strong></em>" 得到 "101"
- [3,4,5] ,从 "001<em><strong>101</strong></em>" 得到 "101"
没有别的合法选择,所以总共有 6 种方法。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>s = "11100"
<b>输出:</b>0
<b>解释:</b>没有任何符合题意的选择。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;= s.length &lt;= 10<sup>5</sup></code></li>
<li><code>s[i]</code>&nbsp;要么是&nbsp;<code>'0'</code>&nbsp;,要么是&nbsp;<code>'1'</code>&nbsp;</li>
</ul>