1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-10-19 03:56:46 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2022-06-10 23:34:17 +08:00
parent 19b3e4846b
commit 6ba311f0f3
69 changed files with 18965 additions and 11938 deletions

View File

@@ -0,0 +1,56 @@
<p>一个音乐会总共有&nbsp;<code>n</code>&nbsp;排座位,编号从&nbsp;<code>0</code>&nbsp;&nbsp;<code>n - 1</code>&nbsp;,每一排有&nbsp;<code>m</code>&nbsp;个座椅,编号为&nbsp;<code>0</code>&nbsp;&nbsp;<code>m - 1</code>&nbsp;。你需要设计一个买票系统,针对以下情况进行座位安排:</p>
<ul>
<li>同一组的 <code>k</code>&nbsp;位观众坐在<strong> 同一排座位,且座位连续 </strong></li>
<li><code>k</code>&nbsp;位观众中 <strong>每一位</strong>&nbsp;都有座位坐,但他们 <strong>不一定</strong>&nbsp;坐在一起。</li>
</ul>
<p>由于观众非常挑剔,所以:</p>
<ul>
<li>只有当一个组里所有成员座位的排数都 <strong>小于等于</strong>&nbsp;<code>maxRow</code>&nbsp;,这个组才能订座位。每一组的&nbsp;<code>maxRow</code>&nbsp;可能 <strong>不同</strong>&nbsp;</li>
<li>如果有多排座位可以选择,优先选择 <strong>最小</strong>&nbsp;的排数。如果同一排中有多个座位可以坐,优先选择号码 <strong>最小</strong>&nbsp;的。</li>
</ul>
<p>请你实现&nbsp;<code>BookMyShow</code>&nbsp;类:</p>
<ul>
<li><code>BookMyShow(int n, int m)</code>&nbsp;,初始化对象,<code>n</code>&nbsp;是排数,<code>m</code>&nbsp;是每一排的座位数。</li>
<li><code>int[] gather(int k, int maxRow)</code>&nbsp;返回长度为 <code>2</code>&nbsp;的数组,表示 <code>k</code>&nbsp;个成员中 <strong>第一个座位</strong>&nbsp;的排数和座位编号,这 <code>k</code>&nbsp;位成员必须坐在 <strong>同一排座位,且座位连续 </strong>。换言之,返回最小可能的&nbsp;<code>r</code>&nbsp;<code>c</code>&nbsp;满足第&nbsp;<code>r</code>&nbsp;排中&nbsp;<code>[c, c + k - 1]</code>&nbsp;的座位都是空的,且&nbsp;<code>r &lt;= maxRow</code>&nbsp;。如果&nbsp;<strong>无法</strong>&nbsp;安排座位,返回&nbsp;<code>[]</code>&nbsp;</li>
<li><code>boolean scatter(int k, int maxRow)</code>&nbsp;如果组里所有&nbsp;<code>k</code>&nbsp;个成员&nbsp;<strong>不一定</strong>&nbsp;要坐在一起的前提下,都能在第&nbsp;<code>0</code> 排到第&nbsp;<code>maxRow</code>&nbsp;排之间找到座位,那么请返回&nbsp;<code>true</code>&nbsp;。这种情况下,每个成员都优先找排数&nbsp;<strong>最小</strong>&nbsp;,然后是座位编号最小的座位。如果不能安排所有&nbsp;<code>k</code>&nbsp;个成员的座位,请返回&nbsp;<code>false</code>&nbsp;</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>
["BookMyShow", "gather", "gather", "scatter", "scatter"]
[[2, 5], [4, 0], [2, 0], [5, 1], [5, 1]]
<strong>输出:</strong>
[null, [0, 0], [], true, false]
<strong>解释:</strong>
BookMyShow bms = new BookMyShow(2, 5); // 总共有 2 排,每排 5 个座位。
bms.gather(4, 0); // 返回 [0, 0]
// 这一组安排第 0 排 [0, 3] 的座位。
bms.gather(2, 0); // 返回 []
// 第 0 排只剩下 1 个座位。
// 所以无法安排 2 个连续座位。
bms.scatter(5, 1); // 返回 True
// 这一组安排第 0 排第 4 个座位和第 1 排 [0, 3] 的座位。
bms.scatter(5, 1); // 返回 False
// 总共只剩下 2 个座位。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>1 &lt;= m, k &lt;= 10<sup>9</sup></code></li>
<li><code>0 &lt;= maxRow &lt;= n - 1</code></li>
<li><code>gather</code>&nbsp;<code>scatter</code>&nbsp;<strong></strong> 调用次数不超过&nbsp;<code>5 * 10<sup>4</sup></code> 次。</li>
</ul>

View File

@@ -0,0 +1,48 @@
<p><strong>句子</strong> 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 <code>'$'</code> 。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。</p>
<ul>
<li>例如 <code>"$100"</code><code>"$23"</code><code>"$6.75"</code> 表示价格,而 <code>"100"</code><code>"$"</code><code>"2$3"</code> 不是。</li>
</ul>
<p><strong>注意:</strong>本题输入中的价格均为整数。</p>
<p>给你一个字符串 <code>sentence</code>&nbsp; 和一个整数 <code>discount</code> 。对于每个表示价格的单词,都在价格的基础上减免 <code>discount%</code> ,并 <strong>更新</strong> 该单词到句子中。所有更新后的价格应该表示为一个 <strong>恰好保留小数点后两位</strong> 的数字。</p>
<p>返回表示修改后句子的字符串。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>sentence = "there are $1 $2 and 5$ candies in the shop", discount = 50
<strong>输出:</strong>"there are $0.50 $1.00 and 5$ candies in the shop"
<strong>解释:</strong>
表示价格的单词是 "$1" 和 "$2" 。
- "$1" 减免 50% 为 "$0.50" ,所以 "$1" 替换为 "$0.50" 。
- "$2" 减免 50% 为 "$1" ,所以 "$1" 替换为 "$1.00" 。</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>sentence = "1 2 $3 4 $5 $6 7 8$ $9 $10$", discount = 100
<strong>输出:</strong>"1 2 $0.00 4 $0.00 $0.00 7 8$ $0.00 $10$"
<strong>解释:</strong>
任何价格减免 100% 都会得到 0 。
表示价格的单词分别是 "$3"、"$5"、"$6" 和 "$9"。
每个单词都替换为 "$0.00"。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= sentence.length &lt;= 10<sup>5</sup></code></li>
<li><code>sentence</code> 由小写英文字母、数字、<code>' '</code>&nbsp;<code>'$'</code> 组成</li>
<li><code>sentence</code> 不含前导和尾随空格</li>
<li><code>sentence</code> 的所有单词都用单个空格分隔</li>
<li>所有价格都是 <strong></strong> 整数且不含前导零</li>
<li>所有价格 <strong>最多</strong>&nbsp; <code>10</code> 位数字</li>
<li><code>0 &lt;= discount &lt;= 100</code></li>
</ul>

View File

@@ -0,0 +1,34 @@
<p>给你一个下标从 <strong>0</strong> 开始的整数数组 <code>nums</code> 。在一步操作中,移除所有满足&nbsp;<code>nums[i - 1] &gt; nums[i]</code><code>nums[i]</code> ,其中 <code>0 &lt; i &lt; nums.length</code></p>
<p>重复执行步骤,直到 <code>nums</code> 变为 <strong>非递减</strong> 数组,返回所需执行的操作数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [5,3,4,4,7,3,6,11,8,5,11]
<strong>输出:</strong>3
<strong>解释:</strong>执行下述几个步骤:
- 步骤 1 [5,<em><strong>3</strong></em>,4,4,7,<em><strong>3</strong></em>,6,11,<em><strong>8</strong></em>,<em><strong>5</strong></em>,11] 变为 [5,4,4,7,6,11,11]
- 步骤 2 [5,<em><strong>4</strong></em>,4,7,<em><strong>6</strong></em>,11,11] 变为 [5,4,7,11,11]
- 步骤 3 [5,<em><strong>4</strong></em>,7,11,11] 变为 [5,7,11,11]
[5,7,11,11] 是一个非递减数组,因此,返回 3 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [4,5,7,7,13]
<strong>输出:</strong>0
<strong>解释:</strong>nums 已经是一个非递减数组,因此,返回 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,54 @@
<p>给你一个整数数组 <code>nums</code> 和一个整数 <code>k</code> 。你可以将 <code>nums</code> 划分成一个或多个 <strong>子序列</strong> ,使 <code>nums</code> 中的每个元素都 <strong>恰好</strong> 出现在一个子序列中。</p>
<p>在满足每个子序列中最大值和最小值之间的差值最多为 <code>k</code> 的前提下,返回需要划分的 <strong>最少</strong> 子序列数目。</p>
<p><strong>子序列</strong> 本质是一个序列,可以通过删除另一个序列中的某些元素(或者不删除)但不改变剩下元素的顺序得到。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [3,6,1,2,5], k = 2
<strong>输出:</strong>2
<strong>解释:</strong>
可以将 nums 划分为两个子序列 [3,1,2] 和 [6,5] 。
第一个子序列中最大值和最小值的差值是 3 - 1 = 2 。
第二个子序列中最大值和最小值的差值是 6 - 5 = 1 。
由于创建了两个子序列,返回 2 。可以证明需要划分的最少子序列数目就是 2 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [1,2,3], k = 1
<strong>输出:</strong>2
<strong>解释:</strong>
可以将 nums 划分为两个子序列 [1,2] 和 [3] 。
第一个子序列中最大值和最小值的差值是 2 - 1 = 1 。
第二个子序列中最大值和最小值的差值是 3 - 3 = 0 。
由于创建了两个子序列,返回 2 。注意,另一种最优解法是将 nums 划分成子序列 [1] 和 [2,3] 。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>nums = [2,2,4,5], k = 0
<strong>输出:</strong>3
<strong>解释:</strong>
可以将 nums 划分为三个子序列 [2,2]、[4] 和 [5] 。
第一个子序列中最大值和最小值的差值是 2 - 2 = 0 。
第二个子序列中最大值和最小值的差值是 4 - 4 = 0 。
第三个子序列中最大值和最小值的差值是 5 - 5 = 0 。
由于创建了三个子序列,返回 3 。可以证明需要划分的最少子序列数目就是 3 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>0 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
<li><code>0 &lt;= k &lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,38 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始长度为 <code>n</code>&nbsp;的字符串&nbsp;<code>num</code>&nbsp;,它只包含数字。</p>
<p>如果对于 <strong>每个</strong><em>&nbsp;</em><code>0 &lt;= i &lt; n</code>&nbsp;的下标&nbsp;<code>i</code>&nbsp;,都满足数位<em>&nbsp;</em><code>i</code>&nbsp;<code>num</code>&nbsp;中出现了&nbsp;<code>num[i]</code>次,那么请你返回&nbsp;<code>true</code>&nbsp;,否则返回&nbsp;<code>false</code>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>num = "1210"
<b>输出:</b>true
<strong>解释:</strong>
num[0] = '1' 。数字 0 在 num 中出现了一次。
num[1] = '2' 。数字 1 在 num 中出现了两次。
num[2] = '1' 。数字 2 在 num 中出现了一次。
num[3] = '0' 。数字 3 在 num 中出现了零次。
"1210" 满足题目要求条件,所以返回 true 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>num = "030"
<b>输出:</b>false
<strong>解释:</strong>
num[0] = '0' 。数字 0 应该出现 0 次,但是在 num 中出现了一次。
num[1] = '3' 。数字 1 应该出现 3 次,但是在 num 中出现了零次。
num[2] = '0' 。数字 2 在 num 中出现了 0 次。
下标 0 和 1 都违反了题目要求,所以返回 false 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == num.length</code></li>
<li><code>1 &lt;= n &lt;= 10</code></li>
<li><code>num</code>&nbsp;只包含数字。</li>
</ul>

View File

@@ -0,0 +1,47 @@
<p>给你一个下标从 <strong>0</strong> 开始的二维整数数组 <code>grid</code> ,数组大小为 <code>m x n</code> 。每个单元格都是两个值之一:</p>
<ul>
<li><code>0</code> 表示一个 <strong></strong> 单元格,</li>
<li><code>1</code> 表示一个可以移除的 <strong>障碍物</strong></li>
</ul>
<p>你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。</p>
<p>现在你需要从左上角&nbsp;<code>(0, 0)</code> 移动到右下角 <code>(m - 1, n - 1)</code> ,返回需要移除的障碍物的 <strong>最小</strong> 数目。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/06/example1drawio-1.png" style="width: 605px; height: 246px;" /></p>
<pre>
<strong>输入:</strong>grid = [[0,1,1],[1,1,0],[1,1,0]]
<strong>输出:</strong>2
<strong>解释:</strong>可以移除位于 (0, 1) 和 (0, 2) 的障碍物来创建从 (0, 0) 到 (2, 2) 的路径。
可以证明我们至少需要移除两个障碍物,所以返回 2 。
注意,可能存在其他方式来移除 2 个障碍物,创建出可行的路径。
</pre>
<p><strong>示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/06/example1drawio.png" style="width: 405px; height: 246px;" /></p>
<pre>
<strong>输入:</strong>grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]
<strong>输出:</strong>0
<strong>解释:</strong>不移除任何障碍物就能从 (0, 0) 到 (2, 4) ,所以返回 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>m == grid.length</code></li>
<li><code>n == grid[i].length</code></li>
<li><code>1 &lt;= m, n &lt;= 10<sup>5</sup></code></li>
<li><code>2 &lt;= m * n &lt;= 10<sup>5</sup></code></li>
<li><code>grid[i][j]</code><code>0</code> <strong></strong> <code>1</code></li>
<li><code>grid[0][0] == grid[m - 1][n - 1] == 0</code></li>
</ul>

View File

@@ -0,0 +1,49 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的数组&nbsp;<code>nums</code>&nbsp;,它包含 <code>n</code>&nbsp;<strong>互不相同</strong>&nbsp;的正整数。请你对这个数组执行 <code>m</code>&nbsp;个操作,在第 <code>i</code>&nbsp;个操作中,你需要将数字&nbsp;<code>operations[i][0]</code> 替换成&nbsp;<code>operations[i][1]</code>&nbsp;</p>
<p>题目保证在第 <code>i</code>&nbsp;个操作中:</p>
<ul>
<li><code>operations[i][0]</code>&nbsp;&nbsp;<code>nums</code>&nbsp;中存在。</li>
<li><code>operations[i][1]</code>&nbsp;&nbsp;<code>nums</code>&nbsp;中不存在。</li>
</ul>
<p>请你返回执行完所有操作后的数组。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>nums = [1,2,4,6], operations = [[1,3],[4,7],[6,1]]
<b>输出:</b>[3,2,7,1]
<b>解释:</b>我们对 nums 执行以下操作:
- 将数字 1 替换为 3 。nums 变为 [<em><strong>3</strong></em>,2,4,6] 。
- 将数字 4 替换为 7 。nums 变为 [3,2,<em><strong>7</strong></em>,6] 。
- 将数字 6 替换为 1 。nums 变为 [3,2,7,<em><strong>1</strong></em>] 。
返回最终数组 [3,2,7,1] 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>nums = [1,2], operations = [[1,3],[2,1],[3,2]]
<b>输出:</b>[2,1]
<b>解释:</b>我们对 nums 执行以下操作:
- 将数字 1 替换为 3 。nums 变为 [<em><strong>3</strong></em>,2] 。
- 将数字 2 替换为 1 。nums 变为 [3,<em><strong>1</strong></em>] 。
- 将数字 3 替换为 2 。nums 变为 [<em><strong>2</strong></em>,1] 。
返回最终数组 [2,1] 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == nums.length</code></li>
<li><code>m == operations.length</code></li>
<li><code>1 &lt;= n, m &lt;= 10<sup>5</sup></code></li>
<li><code>nums</code>&nbsp;中所有数字 <strong>互不相同</strong>&nbsp;</li>
<li><code>operations[i].length == 2</code></li>
<li><code>1 &lt;= nums[i], operations[i][0], operations[i][1] &lt;= 10<sup>6</sup></code></li>
<li>在执行第&nbsp;<code>i</code> 个操作时,<code>operations[i][0]</code>&nbsp;&nbsp;<code>nums</code>&nbsp;中存在。</li>
<li>在执行第&nbsp;<code>i</code>&nbsp;个操作时,<code>operations[i][1]</code>&nbsp;&nbsp;<code>nums</code>&nbsp;中不存在。</li>
</ul>

View File

@@ -0,0 +1,47 @@
<p>给你一个聊天记录,共包含 <code>n</code>&nbsp;条信息。给你两个字符串数组&nbsp;<code>messages</code>&nbsp;<code>senders</code>&nbsp;,其中&nbsp;<code>messages[i]</code>&nbsp;&nbsp;<code>senders[i]</code>&nbsp;发出的一条&nbsp;<strong>信息</strong>&nbsp;</p>
<p>一条 <strong>信息</strong>&nbsp;是若干用单个空格连接的 <strong>单词</strong>&nbsp;,信息开头和结尾不会有多余空格。发件人的 <strong>单词计数</strong>&nbsp;是这个发件人总共发出的 <strong>单词数</strong>&nbsp;。注意,一个发件人可能会发出多于一条信息。</p>
<p>请你返回发出单词数 <strong>最多</strong>&nbsp;的发件人名字。如果有多个发件人发出最多单词数,请你返回 <strong>字典序</strong>&nbsp;最大的名字。</p>
<p><strong>注意:</strong></p>
<ul>
<li>字典序里,大写字母小于小写字母。</li>
<li><code>"Alice"</code>&nbsp;<code>"alice"</code>&nbsp;是不同的名字。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><b>输入:</b>messages = ["Hello userTwooo","Hi userThree","Wonderful day Alice","Nice day userThree"], senders = ["Alice","userTwo","userThree","Alice"]
<b>输出:</b>"Alice"
<b>解释:</b>Alice 总共发出了 2 + 3 = 5 个单词。
userTwo 发出了 2 个单词。
userThree 发出了 3 个单词。
由于 Alice 发出单词数最多,所以我们返回 "Alice" 。
</pre>
<p><strong>示例 2</strong></p>
<pre><b>输入:</b>messages = ["How is leetcode for everyone","Leetcode is useful for practice"], senders = ["Bob","Charlie"]
<b>输出:</b>"Charlie"
<b>解释:</b>Bob 总共发出了 5 个单词。
Charlie 总共发出了 5 个单词。
由于最多单词数打平,返回字典序最大的名字,也就是 Charlie 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == messages.length == senders.length</code></li>
<li><code>1 &lt;= n &lt;= 10<sup>4</sup></code></li>
<li><code>1 &lt;= messages[i].length &lt;= 100</code></li>
<li><code>1 &lt;= senders[i].length &lt;= 10</code></li>
<li><code>messages[i]</code>&nbsp;包含大写字母、小写字母和&nbsp;<code>' '</code>&nbsp;</li>
<li><code>messages[i]</code>&nbsp;中所有单词都由 <strong>单个空格</strong>&nbsp;隔开。</li>
<li><code>messages[i]</code>&nbsp;不包含前导和后缀空格。</li>
<li><code>senders[i]</code>&nbsp;只包含大写英文字母和小写英文字母。</li>
</ul>

View File

@@ -0,0 +1,47 @@
<p>给你一个下标从 <strong>0</strong> 开始的整数数组 <code>nums</code> ,其长度是 <code>2</code> 的幂。</p>
<p><code>nums</code> 执行下述算法:</p>
<ol>
<li><code>n</code> 等于 <code>nums</code> 的长度,如果 <code>n == 1</code> <strong>终止</strong> 算法过程。否则,<strong>创建</strong> 一个新的整数数组&nbsp;<code>newNums</code> ,新数组长度为 <code>n / 2</code> ,下标从 <strong>0</strong> 开始。</li>
<li>对于满足&nbsp;<code>0 &lt;= i &lt; n / 2</code> 的每个 <strong>偶数</strong> 下标 <code>i</code> ,将 <code>newNums[i]</code> <strong>赋值</strong><code>min(nums[2 * i], nums[2 * i + 1])</code></li>
<li>对于满足&nbsp;<code>0 &lt;= i &lt; n / 2</code> 的每个 <strong>奇数</strong> 下标 <code>i</code> ,将 <code>newNums[i]</code> <strong>赋值</strong><code>max(nums[2 * i], nums[2 * i + 1])</code></li>
<li><code>newNums</code> 替换 <code>nums</code></li>
<li>从步骤 1 开始 <strong>重复</strong> 整个过程。</li>
</ol>
<p>执行算法后,返回 <code>nums</code> 中剩下的那个数字。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/13/example1drawio-1.png" style="width: 500px; height: 240px;" /></p>
<pre>
<strong>输入:</strong>nums = [1,3,5,2,4,8,2,2]
<strong>输出:</strong>1
<strong>解释:</strong>重复执行算法会得到下述数组。
第一轮nums = [1,5,4,2]
第二轮nums = [1,4]
第三轮nums = [1]
1 是最后剩下的那个数字,返回 1 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [3]
<strong>输出:</strong>3
<strong>解释:</strong>3 就是最后剩下的数字,返回 3 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 1024</code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
<li><code>nums.length</code><code>2</code> 的幂</li>
</ul>

View File

@@ -0,0 +1,70 @@
<p>请你设计一个带光标的文本编辑器,它可以实现以下功能:</p>
<ul>
<li><strong>添加:</strong>在光标所在处添加文本。</li>
<li><strong>删除:</strong>在光标所在处删除文本(模拟键盘的删除键)。</li>
<li><strong>移动:</strong>将光标往左或者往右移动。</li>
</ul>
<p>当删除文本时,只有光标左边的字符会被删除。光标会留在文本内,也就是说任意时候&nbsp;<code>0 &lt;= cursor.position &lt;= currentText.length</code>&nbsp;都成立。</p>
<p>请你实现&nbsp;<code>TextEditor</code>&nbsp;类:</p>
<ul>
<li><code>TextEditor()</code>&nbsp;用空文本初始化对象。</li>
<li><code>void addText(string text)</code>&nbsp;&nbsp;<code>text</code>&nbsp;添加到光标所在位置。添加完后光标在&nbsp;<code>text</code>&nbsp;的右边。</li>
<li><code>int deleteText(int k)</code>&nbsp;删除光标左边&nbsp;<code>k</code>&nbsp;个字符。返回实际删除的字符数目。</li>
<li><code>string cursorLeft(int k)</code> 将光标向左移动&nbsp;<code>k</code>&nbsp;次。返回移动后光标左边&nbsp;<code>min(10, len)</code>&nbsp;个字符,其中&nbsp;<code>len</code>&nbsp;是光标左边的字符数目。</li>
<li><code>string cursorRight(int k)</code>&nbsp;将光标向右移动&nbsp;<code>k</code>&nbsp;次。返回移动后光标左边&nbsp;<code>min(10, len)</code>&nbsp;个字符,其中&nbsp;<code>len</code>&nbsp;是光标左边的字符数目。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>
["TextEditor", "addText", "deleteText", "addText", "cursorRight", "cursorLeft", "deleteText", "cursorLeft", "cursorRight"]
[[], ["leetcode"], [4], ["practice"], [3], [8], [10], [2], [6]]
<strong>输出:</strong>
[null, null, 4, null, "etpractice", "leet", 4, "", "practi"]
<strong>解释:</strong>
TextEditor textEditor = new TextEditor(); // 当前 text 为 "|" 。('|' 字符表示光标)
textEditor.addText("leetcode"); // 当前文本为 "leetcode|" 。
textEditor.deleteText(4); // 返回 4
// 当前文本为 "leet|" 。
// 删除了 4 个字符。
textEditor.addText("practice"); // 当前文本为 "leetpractice|" 。
textEditor.cursorRight(3); // 返回 "etpractice"
// 当前文本为 "leetpractice|".
// 光标无法移动到文本以外,所以无法移动。
// "etpractice" 是光标左边的 10 个字符。
textEditor.cursorLeft(8); // 返回 "leet"
// 当前文本为 "leet|practice" 。
// "leet" 是光标左边的 min(10, 4) = 4 个字符。
textEditor.deleteText(10); // 返回 4
// 当前文本为 "|practice" 。
// 只有 4 个字符被删除了。
textEditor.cursorLeft(2); // 返回 ""
// 当前文本为 "|practice" 。
// 光标无法移动到文本以外,所以无法移动。
// "" 是光标左边的 min(10, 0) = 0 个字符。
textEditor.cursorRight(6); // 返回 "practi"
// 当前文本为 "practi|ce" 。
// "practi" 是光标左边的 min(10, 6) = 6 个字符。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= text.length, k &lt;= 40</code></li>
<li><code>text</code>&nbsp;只含有小写英文字母。</li>
<li>调用 <code>addText</code>&nbsp;<code>deleteText</code>&nbsp;<code>cursorLeft</code>&nbsp;<code>cursorRight</code>&nbsp;<strong></strong> 次数不超过&nbsp;<code>2 * 10<sup>4</sup></code>&nbsp;次。</li>
</ul>
<p>&nbsp;</p>
<p><strong>进阶:</strong>你能设计并实现一个每次调用时间复杂度为 <code>O(k)</code> 的解决方案吗?</p>

View File

@@ -0,0 +1,53 @@
<p>给你一个整数&nbsp;<code>n</code>&nbsp;,表示一个国家里的城市数目。城市编号为&nbsp;<code>0</code>&nbsp;&nbsp;<code>n - 1</code>&nbsp;</p>
<p>给你一个二维整数数组&nbsp;<code>roads</code>&nbsp;,其中&nbsp;<code>roads[i] = [a<sub>i</sub>, b<sub>i</sub>]</code>&nbsp;表示城市&nbsp;<code>a<sub>i</sub></code>&nbsp;&nbsp;<code>b<sub>i</sub></code>&nbsp;之间有一条&nbsp;<strong>双向</strong>&nbsp;道路。</p>
<p>你需要给每个城市安排一个从 <code>1</code>&nbsp;<code>n</code>&nbsp;之间的整数值,且每个值只能被使用 <strong>一次</strong>&nbsp;。道路的 <strong>重要性</strong>&nbsp;定义为这条道路连接的两座城市数值 <strong>之和</strong>&nbsp;</p>
<p>请你返回在最优安排下,<strong>所有道路重要性</strong> 之和 <strong>最大</strong>&nbsp;为多少。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/07/ex1drawio.png" style="width: 290px; height: 215px;"></p>
<pre><b>输入:</b>n = 5, roads = [[0,1],[1,2],[2,3],[0,2],[1,3],[2,4]]
<b>输出:</b>43
<b>解释:</b>上图展示了国家图和每个城市被安排的值 [2,4,5,3,1] 。
- 道路 (0,1) 重要性为 2 + 4 = 6 。
- 道路 (1,2) 重要性为 4 + 5 = 9 。
- 道路 (2,3) 重要性为 5 + 3 = 8 。
- 道路 (0,2) 重要性为 2 + 5 = 7 。
- 道路 (1,3) 重要性为 4 + 3 = 7 。
- 道路 (2,4) 重要性为 5 + 1 = 6 。
所有道路重要性之和为 6 + 9 + 8 + 7 + 7 + 6 = 43 。
可以证明,重要性之和不可能超过 43 。
</pre>
<p><strong>示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2022/04/07/ex2drawio.png" style="width: 281px; height: 151px;"></p>
<pre><b>输入:</b>n = 5, roads = [[0,3],[2,4],[1,3]]
<b>输出:</b>20
<b>解释:</b>上图展示了国家图和每个城市被安排的值 [4,3,2,5,1] 。
- 道路 (0,3) 重要性为 4 + 5 = 9 。
- 道路 (2,4) 重要性为 2 + 1 = 3 。
- 道路 (1,3) 重要性为 3 + 5 = 8 。
所有道路重要性之和为 9 + 3 + 8 = 20 。
可以证明,重要性之和不可能超过 20 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= n &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>1 &lt;= roads.length &lt;= 5 * 10<sup>4</sup></code></li>
<li><code>roads[i].length == 2</code></li>
<li><code>0 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= n - 1</code></li>
<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
<li>没有重复道路。</li>
</ul>

View File

@@ -0,0 +1,45 @@
<p>给你两个下标从 <strong>0</strong> 开始的字符串 <code>s</code><code>target</code> 。你可以从 <code>s</code> 取出一些字符并将其重排,得到若干新的字符串。</p>
<p><code>s</code> 中取出字符并重新排列,返回可以形成 <code>target</code><strong>最大</strong> 副本数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>s = "ilovecodingonleetcode", target = "code"
<strong>输出:</strong>2
<strong>解释:</strong>
对于 "code" 的第 1 个副本,选取下标为 4 、5 、6 和 7 的字符。
对于 "code" 的第 2 个副本,选取下标为 17 、18 、19 和 20 的字符。
形成的字符串分别是 "ecod" 和 "code" ,都可以重排为 "code" 。
可以形成最多 2 个 "code" 的副本,所以返回 2 。
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>s = "abcba", target = "abc"
<strong>输出:</strong>1
<strong>解释:</strong>
选取下标为 0 、1 和 2 的字符,可以形成 "abc" 的 1 个副本。
可以形成最多 1 个 "abc" 的副本,所以返回 1 。
注意,尽管下标 3 和 4 分别有额外的 'a' 和 'b' ,但不能重用下标 2 处的 'c' ,所以无法形成 "abc" 的第 2 个副本。
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>s = "abbaccaddaeea", target = "aaaaa"
<strong>输出:</strong>1
<strong>解释:</strong>
选取下标为 0 、3 、6 、9 和 12 的字符,可以形成 "aaaaa" 的 1 个副本。
可以形成最多 1 个 "aaaaa" 的副本,所以返回 1 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= s.length &lt;= 100</code></li>
<li><code>1 &lt;= target.length &lt;= 10</code></li>
<li><code>s</code><code>target</code> 由小写英文字母组成</li>
</ul>