1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-09-04 23:11:41 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2023-05-15 17:43:00 +08:00
parent 9732c4f3bc
commit 0b115f313a
122 changed files with 24024 additions and 13160 deletions

View File

@@ -0,0 +1,58 @@
探险家小扣终于来到了万灵之树前,挑战最后的谜题。
已知小扣拥有足够数量的链接节点和 `n` 颗幻境宝石,`gem[i]` 表示第 `i` 颗宝石的数值。现在小扣需要使用这些链接节点和宝石组合成一颗二叉树,其组装规则为:
- 链接节点将作为二叉树中的非叶子节点,且每个链接节点必须拥有 `2` 个子节点;
- 幻境宝石将作为二叉树中的叶子节点,所有的幻境宝石都必须被使用。
能量首先进入根节点,而后将按如下规则进行移动和记录:
- 若能量首次到达该节点时:
- 记录数字 `1`
- 若该节点为叶节点,将额外记录该叶节点的数值;
- 若存在未到达的子节点,则选取未到达的一个子节点(优先选取左子节点)进入;
- 若无子节点或所有子节点均到达过,此时记录 `9`,并回到当前节点的父节点(若存在)。
如果最终记下的数依序连接成一个整数 `num`,满足 $num \mod~p=target$,则视为解开谜题。
请问有多少种二叉树的组装方案,可以使得最终记录下的数字可以解开谜题
**注意:**
- 两棵结构不同的二叉树,作为不同的组装方案
- 两棵结构相同的二叉树且存在某个相同位置处的宝石编号不同,也作为不同的组装方案
- 可能存在数值相同的两颗宝石
**示例 1**
> 输入:`gem = [2,3]`
> `p = 100000007`
> `target = 11391299`
>
> 输出:`1`
>
> 解释:
> 包含 `2` 个叶节点的结构只有一种。
> 假设 B、C 节点的值分别为 3、2对应 target 为 11391299如下图所示。
> 11391299 % 100000007 = 11391299满足条件;
> 假设 B、C 节点的值分别为 2、3对应 target 为 11291399;
> 11291399 % 100000007 = 11291399不满足条件
> 因此只存在 1 种方案,返回 1
![万灵 (1).gif](https://pic.leetcode.cn/1682397079-evMssw-%E4%B8%87%E7%81%B5%20\(1\).gif){:height=300px}
**示例 2**
> 输入:`gem = [3,21,3]`
> `p = 7`
> `target = 5`
>
> 输出:`4`
>
> 解释:
包含 `3` 个叶节点树结构有两种,列举如下:
满足条件的组合有四种情况:
> 当结构为下图1叶子节点的值为 [3,3,21] 或 [3,3,21],得到的整数为 `11139139912199`。
> 当结构为下图2叶子节点的值为 [21,3,3] 或 [21,3,3],得到的整数为 `11219113913999`。
![image.png](https://pic.leetcode.cn/1682322894-vfqJIV-image.png){:width=500px}
**提示:**
- `1 <= gem.length <= 9`
- `0 <= gem[i] <= 10^9`
- `1 <= p <= 10^9`,保证 $p$ 为素数。
- `0 <= target < p`
- 存在 2 组 `gem.length == 9` 的用例

View File

@@ -0,0 +1,54 @@
在永恒之森中,封存着有关万灵之树线索的卷轴,只要探险队通过最后的考验,便可以获取前往万灵之树的线索。
探险队需要从一段不断变化的谜题数组中找到最终的密码,初始的谜题为长度为 `n` 的数组 `arr`(下标从 0 开始),数组中的数字代表了 `k` 位二进制数。
破解谜题的过程中,需要使用 `与非NAND` 运算方式,`operations[i] = [type,x,y]` 表示第 `i` 次进行的谜题操作信息:
-`type = 0`,表示修改操作,将谜题数组中下标 `x` 的数字变化为 `y`
-`type = 1`,表示运算操作,将数字 `y` 进行 `x*n` 次「与非」操作,第 `i` 次与非操作为 `y = y NAND arr[i%n]`
> 运算操作结果即:`y NAND arr[0%n] NAND arr[1%n] NAND arr[2%n] ... NAND arr[(x*n-1)%n]`
最后,将所有运算操作的结果按顺序逐一进行 `异或XOR`运算,从而得到最终解开封印的密码。请返回最终解开封印的密码。
**注意:**
- 「与非」NAND的操作为先进行 `与` 操作,后进行 `非` 操作。
> 例如:两个三位二进制数`2`和`3`,其与非结果为 `NOT ((010) AND (011)) = (101) = 5`
**示例 1**
> 输入:
> `k = 3`
> `arr = [1,2]`
> `operations = [[1,2,3],[0,0,3],[1,2,2]]`
>
> 输出: `2`
>
> 解释:
> 初始的谜题数组为 [1,2],二进制位数为 3
> 第 0 次进行运算操作,将数字 3(011) 进行 2\*2 次「与非」运算,
> 运算操作结果为 `3 NAND 1 NAND 2 NAND 1 NAND 2 = 5`
> 第 1 次进行修改操作,谜题数组的第 `0` 个数字变化为 `3`,谜题变成 `[3,2]`
> 第 2 次进行运算操作,将数字 2(010) 进行 2\*2 次「与非」运算,
> 运算操作结果为 `2 NAND 3 NAND 2 NAND 3 NAND 2 = 7`
> 所有运算操作结果进行「异或」运算为 `5 XOR 7 = 2`
> 因此得到的最终密码为 `2`。
**示例 2**
> 输入:
> `k = 4`
> `arr = [4,6,4,7,10,9,11]`
> `operations = [[1,5,7],[1,7,14],[0,6,7],[1,6,5]]`
> 输出: `9`
> 解释:
> 初始的谜题数组为 [4,6,4,7,10,9,11],
> 第 0 次进行运算操作,运算操作结果为 5
> 第 1 次进行运算操作,运算操作结果为 5
> 第 2 次进行修改操作,修改后谜题数组为 [4, 6, 4, 7, 10, 9, 7]
> 第 3 次进行运算操作,运算操作结果为 9
> 所有运算操作结果进行「异或」运算为 `5 XOR 5 XOR 9 = 9`
> 因此得到的最终密码为 `9`。
**提示:**
- `1 <= arr.length, operations.length <= 10^4`
- `1 <= k <= 30`
- `0 <= arr[i] < 2^k`
-`type = 0``0 <= x < arr.length``0 <= y < 2^k`
-`type = 1``1 <= x < 10^9``0 <= y < 2^k`
- 保证存在 `type = 1` 的操作

View File

@@ -0,0 +1,25 @@
<p>二进制数转字符串。给定一个介于0和1之间的实数如0.72类型为double打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示则打印“ERROR”。</p>
<p><strong>示例1:</strong></p>
<pre>
<strong> 输入</strong>0.625
<strong> 输出</strong>"0.101"
</pre>
<p><strong>示例2:</strong></p>
<pre>
<strong> 输入</strong>0.1
<strong> 输出</strong>"ERROR"
<strong> 提示</strong>0.1无法被二进制准确表示
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li>32位包括输出中的 <code>"0."</code> 这两位。</li>
<li>题目保证输入用例的小数位数最多只有 <code>6</code></li>
</ul>

View File

@@ -0,0 +1,51 @@
<p>给你一个整数&nbsp;<code>n</code>&nbsp;表示一棵 <b>满二叉树</b>&nbsp;里面节点的数目,节点编号从 <code>1</code>&nbsp;<code>n</code>&nbsp;。根节点编号为 <code>1</code>&nbsp;,树中每个非叶子节点&nbsp;<code>i</code>&nbsp;都有两个孩子,分别是左孩子&nbsp;<code>2 * i</code>&nbsp;和右孩子&nbsp;<code>2 * i + 1</code>&nbsp;</p>
<p>树中每个节点都有一个值,用下标从<b>&nbsp;0</b>&nbsp;开始、长度为 <code>n</code>&nbsp;的整数数组&nbsp;<code>cost</code>&nbsp;表示,其中&nbsp;<code>cost[i]</code>&nbsp;是第&nbsp;<code>i + 1</code>&nbsp;个节点的值。每次操作,你可以将树中&nbsp;<strong>任意</strong>&nbsp;节点的值&nbsp;<strong>增加</strong>&nbsp;<code>1</code>&nbsp;。你可以执行操作 <strong>任意</strong> 次。</p>
<p>你的目标是让根到每一个 <strong>叶子结点</strong>&nbsp;的路径值相等。请你返回 <strong>最少</strong>&nbsp;需要执行增加操作多少次。</p>
<p><b>注意:</b></p>
<ul>
<li><strong>满二叉树</strong>&nbsp;指的是一棵树,它满足树中除了叶子节点外每个节点都恰好有 2 个节点,且所有叶子节点距离根节点距离相同。</li>
<li><strong>路径值</strong> 指的是路径上所有节点的值之和。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/04/04/binaryytreeedrawio-4.png" /></p>
<pre>
<b>输入:</b>n = 7, cost = [1,5,2,2,3,3,1]
<b>输出:</b>6
<b>解释:</b>我们执行以下的增加操作:
- 将节点 4 的值增加一次。
- 将节点 3 的值增加三次。
- 将节点 7 的值增加两次。
从根到叶子的每一条路径值都为 9 。
总共增加次数为 1 + 3 + 2 = 6 。
这是最小的答案。
</pre>
<p><strong>示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/04/04/binaryytreee2drawio.png" style="width: 205px; height: 151px;" /></p>
<pre>
<b>输入:</b>n = 3, cost = [5,3,3]
<b>输出:</b>0
<b>解释:</b>两条路径已经有相等的路径值,所以不需要执行任何增加操作。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>n + 1</code>&nbsp;<code>2</code>&nbsp;的幂</li>
<li><code>cost.length == n</code></li>
<li><code>1 &lt;= cost[i] &lt;= 10<sup>4</sup></code></li>
</ul>

View File

@@ -0,0 +1,48 @@
<p>给定一个数组&nbsp;<code>arr</code>&nbsp;和一个块大小&nbsp;<code>size</code>&nbsp;,返回一个 <strong>分块</strong>&nbsp;的数组。<strong>分块</strong>&nbsp;的数组包含了&nbsp;<code>arr</code>&nbsp;中的原始元素,但是每个子数组的长度都是&nbsp;<code>size</code>&nbsp;。如果&nbsp;<code>arr.length</code>&nbsp;不能被&nbsp;<code>size</code>&nbsp;整除,那么最后一个子数组的长度可能小于&nbsp;<code>size</code>&nbsp;</p>
<p>你可以假设该数组是&nbsp;<code>JSON.parse</code>&nbsp;的输出结果。换句话说它是有效的JSON。</p>
<p>请你在不使用 lodash 的函数&nbsp;<code>_.chunk</code>&nbsp;的情况下解决这个问题。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>arr = [1,2,3,4,5], size = 1
<b>输出:</b>[[1],[2],[3],[4],[5]]
<b>解释:</b>数组 <code>arr </code>被分割成了每个只有一个元素的子数组。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>arr = [1,9,6,3,2], size = 3
<b>输出:</b>[[1,9,6],[3,2]]
<b>解释:</b>数组 <code>arr </code>被分割成了每个有三个元素的子数组。然而,第二个子数组只有两个元素。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>arr = [8,5,3,2,6], size = 6
<b>输出:</b>[[8,5,3,2,6]]
<b>解释:</b><code>size </code>大于 <code>arr.length </code>,因此所有元素都在第一个子数组中。
</pre>
<p><strong class="example">示例 4</strong></p>
<pre>
<b>输入:</b>arr = [], size = 1
<b>输出:</b>[]
<b>解释:</b>没有元素需要分块,因此返回一个空数组。</pre>
<p>&nbsp;</p>
<p><b>提示:</b></p>
<ul>
<li><code>arr is a valid JSON array</code></li>
<li><code>2 &lt;= JSON.stringify(arr).length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= size &lt;= arr.length + 1</code></li>
</ul>

View File

@@ -0,0 +1,34 @@
请你编写一个名为 <code>createHelloWorld</code> 的函数。它应该返回一个新的函数,该函数总是返回 <code>"Hello World"</code>&nbsp;
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>args = []
<b>输出:</b>"Hello World"
<strong>解释:</strong>
const f = createHelloWorld();
f(); // "Hello World"
createHelloWorld 返回的函数应始终返回 "Hello World"。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>args = [{},null,42]
<b>输出:</b>"Hello World"
<strong>解释:</strong>
const f = createHelloWorld();
f({}, null, 42); // "Hello World"
可以传递任何参数给函数,但它应始终返回 "Hello World"。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= args.length &lt;= 10</code></li>
</ul>

View File

@@ -0,0 +1,41 @@
<p>给定一个函数 <code>fn</code> ,它返回一个新的函数,返回的函数与原始函数完全相同,只不过它确保 <code>fn</code> 最多被调用一次。</p>
<ul>
<li>第一次调用返回的函数时,它应该返回与 <code>fn</code> 相同的结果。</li>
<li>第一次后的每次调用,它应该返回 <code>undefined</code></li>
</ul>
<p>&nbsp;</p>
<p><b>示例 1</b></p>
<pre>
<b>输入:</b>fn = (a,b,c) =&gt; (a + b + c), calls = [[1,2,3],[2,3,6]]
<b>输出:</b>[{"calls":1,"value":6}]
<strong>解释:</strong>
const onceFn = once(fn);
onceFn(1, 2, 3); // 6
onceFn(2, 3, 6); // undefined, fn 没有被调用
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>fn = (a,b,c) =&gt; (a * b * c), calls = [[5,7,4],[2,3,6],[4,6,8]]
<b>输出:</b>[{"calls":1,"value":140}]
<strong>解释:</strong>
const onceFn = once(fn);
onceFn(5, 7, 4); // 140
onceFn(2, 3, 6); // undefined, fn 没有被调用
onceFn(4, 6, 8); // undefined, fn 没有被调用
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= calls.length &lt;= 10</code></li>
<li><code>1 &lt;= calls[i].length &lt;= 100</code></li>
<li><code>2 &lt;= JSON.stringify(calls).length &lt;= 1000</code></li>
</ul>

View File

@@ -0,0 +1,32 @@
在探险营地间,小扣意外发现了一片城墙遗迹,在探索期间,却不巧遇到迁徙中的兽群向他迎面冲来。情急之下小扣吹响了他的苍蓝笛,随着笛声响起,遗迹中的城墙逐渐发生了横向膨胀。
已知 `rampart[i] = [x,y]` 表示第 `i` 段城墙的初始所在区间。当城墙发生膨胀时,将遵循以下规则:
- 所有的城墙会同时膨胀相等的长度;
- 每个城墙可以向左、向右或向两个方向膨胀。
小扣为了确保自身的安全,需要在所有城墙均无重叠的情况下,让城墙尽可能的膨胀。请返回城墙可以膨胀的 **最大值**
**注意:**
- 初始情况下,所有城墙均不重叠,且 `rampart` 中的元素升序排列;
- 两侧的城墙可以向外无限膨胀。
**示例 1**
>输入:`rampart = [[0,3],[4,5],[7,9]]`
>
>输出:`3`
>
>解释:如下图所示:
>`rampart[0]` 向左侧膨胀 3 个单位;
>`rampart[2]` 向右侧膨胀 3 个单位;
>`rampart[1]` 向左侧膨胀 1 个单位,向右膨胀 2 个单位。
>不存在膨胀更多的方案,返回 3。
![image.png](https://pic.leetcode.cn/1681717918-tWywrp-image.png){:width=750px}
**示例 2**
>输入:`rampart = [[1,2],[5,8],[11,15],[18,25]]`
>
>输出:`4`
**提示:**
- `3 <= rampart.length <= 10^4`
- `rampart[i].length == 2`
- `0 <= rampart[i][0] < rampart[i][1] <= rampart[i+1][0] <= 10^8`

View File

@@ -0,0 +1,127 @@
<p>编写一个函数,将对象数组&nbsp;<code>arr</code>&nbsp;转换为矩阵&nbsp;<code>m</code>&nbsp;</p>
<p><code>arr</code>&nbsp;是一个由对象组成的数组或一个数组。数组中的每个项都可以包含深层嵌套的子数组和子对象。它还可以包含数字、字符串、布尔值和空值。</p>
<p>矩阵&nbsp;<code>m</code>&nbsp;的第一行应该是列名。如果没有嵌套,列名是对象中的唯一键。如果存在嵌套,列名是对象中相应路径,以点号&nbsp;<code>"."</code>&nbsp;分隔。</p>
<p>剩余的每一行对应&nbsp;<code>arr</code>&nbsp;中的一个对象。矩阵中的每个值对应对象中的一个值。如果给定对象在给定列中没有值,则应该包含空字符串 <code>""</code></p>
<p>矩阵中的列应按 <strong>字典升序</strong> 排列。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>
arr = [
&nbsp; {"b": 1, "a": 2},
&nbsp; {"b": 3, "a": 4}
]
<b>输出:</b>
[
&nbsp; ["a", "b"],
&nbsp; [2, 1],
&nbsp; [4, 3]
]
<strong>解释:</strong>
两个对象中有两个唯一的列名:"a"和"b"。
"a"对应[2, 4]。
"b"对应[1, 3]。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>
arr = [
&nbsp; {"a": 1, "b": 2},
&nbsp; {"c": 3, "d": 4},
&nbsp; {}
]
<b>输出:</b>
[
&nbsp; ["a", "b", "c", "d"],
&nbsp; [1, 2, "", ""],
&nbsp; ["", "", 3, 4],
&nbsp; ["", "", "", ""]
]
<strong>解释:</strong>
有四个唯一的列名:"a"、"b"、"c"、"d"。
第一个对象具有与"a"和"b"关联的值。
第二个对象具有与"c"和"d"关联的值。
第三个对象没有键,因此只是一行空字符串。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>
arr = [
&nbsp; {"a": {"b": 1, "c": 2}},
&nbsp; {"a": {"b": 3, "d": 4}}
]
<b>输出:</b>
[
&nbsp; ["a.b", "a.c", "a.d"],
&nbsp; [1, 2, ""],
&nbsp; [3, "", 4]
]
<b>解释:</b>
在这个例子中,对象是嵌套的。键表示每个值的完整路径,路径之间用句点分隔。
有三个路径:"a.b"、"a.c"、"a.d"。
</pre>
<p><strong class="example">示例 4</strong></p>
<pre>
<b>输入:</b>
arr = [
&nbsp; [{"a": null}],
&nbsp; [{"b": true}],
&nbsp; [{"c": "x"}]
]
<strong>输出:</strong>
[
&nbsp; ["0.a", "0.b", "0.c"],
&nbsp; [null, "", ""],
&nbsp; ["", true, ""],
&nbsp; ["", "", "x"]
]
<strong>解释:</strong>
数组也被视为具有索引为键的对象。
每个数组只有一个元素,所以键是"0.a"、"0.b"和"0.c"。
</pre>
<p><strong class="example">示例 5</strong></p>
<pre>
<b>输入:</b>
arr = [
{},
&nbsp; {},
&nbsp; {},
]
<b>输出:</b>
[
&nbsp; [],
&nbsp; [],
&nbsp; [],
&nbsp; []
]
<strong>解释:</strong>
没有键,所以每一行都是一个空数组。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= arr.length &lt;= 1000</code></li>
<li><code>unique keys &lt;= 1000</code></li>
</ul>

View File

@@ -0,0 +1,44 @@
<p>给你一个下标从 <strong>0</strong> 开始的数组 <code>nums</code> ,数组长度为 <code>n</code></p>
<p><code>nums</code><strong>不同元素数目差</strong> 数组可以用一个长度为 <code>n</code> 的数组 <code>diff</code> 表示,其中 <code>diff[i]</code> 等于前缀 <code>nums[0, ..., i]</code> 中不同元素的数目 <strong>减去</strong> 后缀 <code>nums[i + 1, ..., n - 1]</code> 中不同元素的数目。</p>
<p>返回<em> </em><code>nums</code><strong>不同元素数目差</strong> 数组。</p>
<p>注意 <code>nums[i, ..., j]</code> 表示 <code>nums</code> 的一个从下标 <code>i</code> 开始到下标 <code>j</code> 结束的子数组(包含下标 <code>i</code><code>j</code> 对应元素)。特别需要说明的是,如果 <code>i &gt; j</code> ,则 <code>nums[i, ..., j]</code> 表示一个空子数组。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [1,2,3,4,5]
<strong>输出:</strong>[-3,-1,1,3,5]
<strong>解释:
</strong>对于 i = 0前缀中有 1 个不同的元素,而在后缀中有 4 个不同的元素。因此diff[0] = 1 - 4 = -3 。
对于 i = 1前缀中有 2 个不同的元素,而在后缀中有 3 个不同的元素。因此diff[1] = 2 - 3 = -1 。
对于 i = 2前缀中有 3 个不同的元素,而在后缀中有 2 个不同的元素。因此diff[2] = 3 - 2 = 1 。
对于 i = 3前缀中有 4 个不同的元素,而在后缀中有 1 个不同的元素。因此diff[3] = 4 - 1 = 3 。
对于 i = 4前缀中有 5 个不同的元素,而在后缀中有 0 个不同的元素。因此diff[4] = 5 - 0 = 5 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [3,2,3,4,2]
<strong>输出:</strong>[-2,-1,0,2,3]
<strong>解释:</strong>
对于 i = 0前缀中有 1 个不同的元素,而在后缀中有 3 个不同的元素。因此diff[0] = 1 - 3 = -2 。
对于 i = 1前缀中有 2 个不同的元素,而在后缀中有 3 个不同的元素。因此diff[1] = 2 - 3 = -1 。
对于 i = 2前缀中有 2 个不同的元素,而在后缀中有 2 个不同的元素。因此diff[2] = 2 - 2 = 0 。
对于 i = 3前缀中有 3 个不同的元素,而在后缀中有 1 个不同的元素。因此diff[3] = 3 - 1 = 2 。
对于 i = 4前缀中有 3 个不同的元素,而在后缀中有 0 个不同的元素。因此diff[4] = 3 - 0 = 3 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n == nums.length&nbsp;&lt;= 50</code></li>
<li><code>1 &lt;= nums[i] &lt;= 50</code></li>
</ul>

View File

@@ -0,0 +1,50 @@
<p><code>n</code> 个朋友在玩游戏。这些朋友坐成一个圈,按 <strong>顺时针方向</strong><code>1</code><code>n</code> 编号。从第 <code>i</code> 个朋友的位置开始顺时针移动 <code>1</code> 步会到达第 <code>(i + 1)</code> 个朋友的位置(<code>1 &lt;= i &lt; n</code>),而从第 <code>n</code> 个朋友的位置开始顺时针移动 <code>1</code> 步会回到第 <code>1</code> 个朋友的位置。</p>
<p>游戏规则如下:</p>
<p><code>1</code> 个朋友接球。</p>
<ul>
<li>接着,第 <code>1</code> 个朋友将球传给距离他顺时针方向 <code>k</code> 步的朋友。</li>
<li>然后,接球的朋友应该把球传给距离他顺时针方向 <code>2 * k</code> 步的朋友。</li>
<li>接着,接球的朋友应该把球传给距离他顺时针方向 <code>3 * k</code> 步的朋友,以此类推。</li>
</ul>
<p>换句话说,在第 <code>i</code> 轮中持有球的那位朋友需要将球传递给距离他顺时针方向 <code>i * k</code> 步的朋友。</p>
<p>当某个朋友第 2 次接到球时,游戏结束。</p>
<p>在整场游戏中没有接到过球的朋友是 <strong>输家</strong></p>
<p>给你参与游戏的朋友数量 <code>n</code> 和一个整数 <code>k</code> ,请按升序排列返回包含所有输家编号的数组 <code>answer</code> 作为答案。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>n = 5, k = 2
<strong>输出:</strong>[4,5]
<strong>解释:</strong>以下为游戏进行情况:
1第 1 个朋友接球,第 <code>1</code> 个朋友将球传给距离他顺时针方向 2 步的玩家 —— 第 3 个朋友。
2第 3 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 2 个朋友。
3第 2 个朋友将球传给距离他顺时针方向 6 步的玩家 —— 第 3 个朋友。
4第 3 个朋友接到两次球,游戏结束。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>n = 4, k = 4
<strong>输出:</strong>[2,3,4]
<strong>解释:</strong>以下为游戏进行情况:
1第 1 个朋友接球,第 <code>1</code> 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 1 个朋友。
2第 1 个朋友接到两次球,游戏结束。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= k &lt;= n &lt;= 50</code></li>
</ul>

View File

@@ -0,0 +1,29 @@
随着兽群逐渐远去,一座大升降机缓缓的从地下升到了远征队面前。借由这台升降机,他们将能够到达地底的永恒至森。
在升降机的操作台上,是一个由魔法符号组成的矩阵,为了便于辨识,我们用小写字母来表示。 `matrix[i][j]` 表示矩阵第 `i``j` 列的字母。该矩阵上有一个提取装置,可以对所在位置的字母提取。
提取装置初始位于矩阵的左上角 `[0,0]`,可以通过每次操作移动到上、下、左、右相邻的 1 格位置中。提取装置每次移动或每次提取均记为一次操作。
远征队需要按照顺序,从矩阵中逐一取出字母以组成 `mantra`,才能够成功的启动升降机。请返回他们 **最少** 需要消耗的操作次数。如果无法完成提取,返回 `-1`
**注意:**
- 提取装置可对同一位置的字母重复提取,每次提取一个
- 提取字母时,需按词语顺序依次提取
**示例 1**
>输入:`matrix = ["sd","ep"], mantra = "speed"`
>
>输出:`10`
>
>解释:如下图所示
![矩阵 (2).gif](https://pic.leetcode-cn.com/1646288670-OTlvAl-%E7%9F%A9%E9%98%B5%20\(2\).gif)
**示例 2**
>输入:`matrix = ["abc","daf","geg"] mantra = "sad"`
>
>输出:`-1`
>
>解释:矩阵中不存在 `s` ,无法提取词语
**提示:**
- `0 < matrix.length, matrix[i].length <= 100`
- `0 < mantra.length <= 100`
- `matrix 和 mantra` 仅由小写字母组成

View File

@@ -0,0 +1,33 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始长度为 <code>n</code>&nbsp;的整数数组&nbsp;<code>nums</code>&nbsp;和一个整数&nbsp;<code>k</code> 。每一次操作中,你可以选择一个数并将它乘&nbsp;<code>2</code>&nbsp;</p>
<p>你最多可以进行 <code>k</code>&nbsp;次操作,请你返回<em>&nbsp;</em><code>nums[0] | nums[1] | ... | nums[n - 1]</code>&nbsp;的最大值。</p>
<p><code>a | b</code>&nbsp;表示两个整数 <code>a</code>&nbsp;<code>b</code>&nbsp;<strong>按位或</strong>&nbsp;运算。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>nums = [12,9], k = 1
<b>输出:</b>30
<b>解释:</b>如果我们对下标为 1 的元素进行操作,新的数组为 [12,18] 。此时得到最优答案为 12 和 18 的按位或运算的结果,也就是 30 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [8,1,2], k = 2
<b>输出:</b>35
<b>解释:</b>如果我们对下标 0 处的元素进行操作,得到新数组 [32,1,2] 。此时得到最优答案为 32|1|2 = 35 。
</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>
<li><code>1 &lt;= k &lt;= 15</code></li>
</ul>

View File

@@ -0,0 +1,45 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始、长度为 <code>n</code>&nbsp;的数组&nbsp;<code>nums</code>&nbsp;。一开始,所有元素都是 <strong>未染色</strong>&nbsp;(值为 <code>0</code>&nbsp;)的。</p>
<p>给你一个二维整数数组&nbsp;<code>queries</code>&nbsp;,其中&nbsp;<code>queries[i] = [index<sub>i</sub>, color<sub>i</sub>]</code>&nbsp;</p>
<p>对于每个操作,你需要将数组 <code>nums</code>&nbsp;中下标为&nbsp;<code>index<sub>i</sub></code>&nbsp;的格子染色为&nbsp;<code>color<sub>i</sub></code>&nbsp;</p>
<p>请你返回一个长度与 <code>queries</code>&nbsp;相等的数组<em>&nbsp;</em><code>answer</code><em>&nbsp;</em>,其中<em>&nbsp;</em><code>answer[i]</code>是前 <code>i</code>&nbsp;个操作&nbsp;<strong>之后</strong>&nbsp;,相邻元素颜色相同的数目。</p>
<p>更正式的,<code>answer[i]</code>&nbsp;是执行完前 <code>i</code>&nbsp;个操作后,<code>0 &lt;= j &lt; n - 1</code>&nbsp;的下标 <code>j</code>&nbsp;中,满足&nbsp;<code>nums[j] == nums[j + 1]</code>&nbsp;<code>nums[j] != 0</code>&nbsp;的数目。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>n = 4, queries = [[0,2],[1,2],[3,1],[1,1],[2,1]]
<b>输出:</b>[0,1,1,0,2]
<b>解释:</b>一开始数组 nums = [0,0,0,0] 0 表示数组中还没染色的元素。
- 第 1 个操作后nums = [2,0,0,0] 。相邻元素颜色相同的数目为 0 。
- 第 2 个操作后nums = [2,2,0,0] 。相邻元素颜色相同的数目为 1 。
- 第 3 个操作后nums = [2,2,0,1] 。相邻元素颜色相同的数目为 1 。
- 第 4 个操作后nums = [2,1,0,1] 。相邻元素颜色相同的数目为 0 。
- 第 5 个操作后nums = [2,1,1,1] 。相邻元素颜色相同的数目为 2 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>n = 1, queries = [[0,100000]]
<b>输出:</b>[0]
<b>解释:</b>一开始数组 nums = [0] 0 表示数组中还没染色的元素。
- 第 1 个操作后nums = [100000] 。相邻元素颜色相同的数目为 0 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= queries.length &lt;= 10<sup>5</sup></code></li>
<li><code>queries[i].length&nbsp;== 2</code></li>
<li><code>0 &lt;= index<sub>i</sub>&nbsp;&lt;= n - 1</code></li>
<li><code>1 &lt;=&nbsp; color<sub>i</sub>&nbsp;&lt;= 10<sup>5</sup></code></li>
</ul>

View File

@@ -0,0 +1,34 @@
在永恒之森中,存在着一本生物进化录,以 **一个树形结构** 记载了所有生物的演化过程。经过观察并整理了各节点间的关系,`parents[i]` 表示编号 `i` 节点的父节点编号(根节点的父节点为 `-1`)。
为了探索和记录其中的演化规律,队伍中的炼金术师提出了一种方法,可以以字符串的形式将其复刻下来,规则如下:
- 初始只有一个根节点,表示演化的起点,依次记录 `01` 字符串中的字符,
- 如果记录 `0`,则在当前节点下添加一个子节点,并将指针指向新添加的子节点;
- 如果记录 `1`,则将指针回退到当前节点的父节点处。
现在需要应用上述的记录方法,复刻下它的演化过程。请返回能够复刻演化过程的字符串中, **字典序最小**`01` 字符串。
**注意:**
- 节点指针最终可以停在任何节点上,不一定要回到根节点。
**示例 1**
> 输入:`parents = [-1,0,0,2]`
>
> 输出:`"00110"`
>
>解释:树结构如下图所示,共存在 2 种记录方案:
>第 1 种方案为0(记录编号 1 的节点) -> 1(回退至节点 0) -> 0(记录编号 2 的节点) -> 0((记录编号 3 的节点))
>第 2 种方案为0(记录编号 2 的节点) -> 0(记录编号 3 的节点) -> 1(回退至节点 2) -> 1(回退至节点 0) -> 0(记录编号 1 的节点)
>返回字典序更小的 `"00110"`
![image.png](https://pic.leetcode.cn/1682319485-cRVudI-image.png){:width=120px}![进化 (3).gif](https://pic.leetcode.cn/1682412701-waHdnm-%E8%BF%9B%E5%8C%96%20\(3\).gif){:width=320px}
**示例 2**
> 输入:`parents = [-1,0,0,1,2,2]`
>
> 输出:`"00101100"`
**提示:**
- `1 <= parents.length <= 10^4`
- `-1 <= parents[i] < i` (即父节点编号小于子节点)

View File

@@ -0,0 +1,54 @@
<p>下标从 <strong>0</strong> 开始、长度为 <code>n</code> 的数组 <code>derived</code> 是由同样长度为 <code>n</code> 的原始 <strong>二进制数组</strong> <code>original</code> 通过计算相邻值的 <strong>按位异或(⊕)</strong>派生而来。</p>
<p>特别地,对于范围&nbsp;<code>[0, n - 1]</code> 内的每个下标 <code>i</code> </p>
<ul>
<li>如果 <code>i = n - 1</code> ,那么 <code>derived[i] = original[i] ⊕ original[0]</code></li>
<li>否则 <code>derived[i] = original[i] ⊕ original[i + 1]</code></li>
</ul>
<p>给你一个数组 <code>derived</code> ,请判断是否存在一个能够派生得到 <code>derived</code><strong>有效原始二进制数组</strong> <code>original</code></p>
<p>如果存在满足要求的原始二进制数组,返回 <em><strong>true</strong> </em>;否则,返回<em> <strong>false</strong> </em></p>
<ul>
<li>二进制数组是仅由 <strong>0</strong><strong>1</strong> 组成的数组。</li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>derived = [1,1,0]
<strong>输出:</strong>true
<strong>解释:</strong>能够派生得到 [1,1,0] 的有效原始二进制数组是 [0,1,0]
derived[0] = original[0] ⊕ original[1] = 0 ⊕ 1 = 1
derived[1] = original[1] ⊕ original[2] = 1 ⊕ 0 = 1
derived[2] = original[2] ⊕ original[0] = 0 ⊕ 0 = 0
</pre>
<p><strong>示例 2</strong></p>
<pre><strong>输入:</strong>derived = [1,1]
<strong>输出:</strong>true
<strong>解释:</strong>能够派生得到 [1,1] 的有效原始二进制数组是 [0,1]
derived[0] = original[0] ⊕ original[1] = 1
derived[1] = original[1] ⊕ original[0] = 1
</pre>
<p><strong>示例 3</strong></p>
<pre><strong>输入:</strong>derived = [1,0]
<strong>输出:</strong>false
<strong>解释:</strong>不存在能够派生得到 [1,0] 的有效原始二进制数组。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>n == derived.length</code></li>
<li><code>1 &lt;= n&nbsp;&lt;= 10<sup>5</sup></code></li>
<li><code>derived</code> 中的值不是 <strong>0</strong> 就是 <strong>1</strong></li>
</ul>

View File

@@ -0,0 +1,35 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的二维整数数组&nbsp;<code>nums</code>&nbsp;。一开始你的分数为&nbsp;<code>0</code>&nbsp;。你需要执行以下操作直到矩阵变为空:</p>
<ol>
<li>矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。</li>
<li>在步骤 1 删除的所有数字中找到最大的一个数字,将它添加到你的 <strong>分数</strong>&nbsp;中。</li>
</ol>
<p>请你返回最后的 <strong>分数</strong>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>nums = [[7,2,1],[6,4,2],[6,5,3],[3,2,1]]
<b>输出:</b>15
<b>解释:</b>第一步操作中,我们删除 7 6 6 和 3 ,将分数增加 7 。下一步操作中,删除 2 4 5 和 2 ,将分数增加 5 。最后删除 1 2 3 和 1 ,将分数增加 3 。所以总得分为 7 + 5 + 3 = 15 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [[1]]
<b>输出:</b>1
<b>解释:</b>我们删除 1 并将分数增加 1 ,所以返回 1 。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 300</code></li>
<li><code>1 &lt;= nums[i].length &lt;= 500</code></li>
<li><code>0 &lt;= nums[i][j] &lt;= 10<sup>3</sup></code></li>
</ul>

View File

@@ -0,0 +1,41 @@
<p>给你一个下标从 <strong>0</strong> 开始、大小为 <code>m x n</code> 的矩阵 <code>grid</code> ,矩阵由若干 <strong></strong> 整数组成。</p>
<p>你可以从矩阵第一列中的 <strong>任一</strong> 单元格出发,按以下方式遍历&nbsp;<code>grid</code> </p>
<ul>
<li>从单元格 <code>(row, col)</code> 可以移动到&nbsp;<code>(row - 1, col + 1)</code><code>(row, col + 1)</code><code>(row + 1, col + 1)</code> 三个单元格中任一满足值 <strong>严格</strong> 大于当前单元格的单元格。</li>
</ul>
<p>返回你在矩阵中能够 <strong>移动</strong><strong>最大</strong> 次数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2023/04/11/yetgriddrawio-10.png" style="width: 201px; height: 201px;">
<pre><strong>输入:</strong>grid = [[2,4,3,5],[5,4,9,3],[3,4,2,11],[10,9,13,15]]
<strong>输出:</strong>3
<strong>解释:</strong>可以从单元格 (0, 0) 开始并且按下面的路径移动:
- (0, 0) -&gt; (0, 1).
- (0, 1) -&gt; (1, 2).
- (1, 2) -&gt; (2, 3).
可以证明这是能够移动的最大次数。</pre>
<p><strong>示例 2</strong></p>
<pre><img alt="" src="https://assets.leetcode.com/uploads/2023/04/12/yetgrid4drawio.png">
<strong>输入:</strong>grid = [[3,2,4],[2,1,9],[1,1,7]]
<strong>输出:</strong>0
<strong>解释:</strong>从第一列的任一单元格开始都无法移动。
</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>2 &lt;= m, n &lt;= 1000</code></li>
<li><code>4 &lt;= m * n &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= grid[i][j] &lt;= 10<sup>6</sup></code></li>
</ul>

View File

@@ -0,0 +1,26 @@
远征队在出发前需要携带一些「符文」,作为后续的冒险储备。`runes[i]` 表示第 `i` 枚符文的魔力值。
他们将从中选取若干符文进行携带,并对这些符文进行重新排列,以确保任意相邻的两块符文之间的魔力值相差不超过 `1`
请返回他们能够携带的符文 **最大数量**
**示例 1**
>输入:`runes = [1,3,5,4,1,7]`
>
>输出:`3`
>
>解释:最佳的选择方案为[3,5,4]
>将其排列为 [3,4,5] 后,任意相邻的两块符文魔力值均不超过 `1`,携带数量为 `3`
>其他满足条件的方案为 [1,1] 和 [7],数量均小于 3。
>因此返回可携带的最大数量 `3`
**示例 2**
>输入:`runes = [1,1,3,3,2,4]`
>
>输出:`6`
>
>解释:排列为 [1,1,2,3,3,4],可携带所有的符文
**提示:**
- `1 <= runes.length <= 10^4`
- `0 <= runes[i] <= 10^4`

View File

@@ -0,0 +1,44 @@
<p>给你一个整数 <code>n</code> 。现有一个包含 <code>n</code> 个顶点的 <strong>无向</strong> 图,顶点按从 <code>0</code><code>n - 1</code> 编号。给你一个二维整数数组 <code>edges</code> 其中 <code>edges[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> 表示顶点 <code>a<sub>i</sub></code><code>b<sub>i</sub></code> 之间存在一条 <strong>无向</strong> 边。</p>
<p>返回图中 <strong>完全连通分量</strong> 的数量。</p>
<p>如果在子图中任意两个顶点之间都存在路径,并且子图中没有任何一个顶点与子图外部的顶点共享边,则称其为 <strong>连通分量</strong></p>
<p>如果连通分量中每对节点之间都存在一条边,则称其为 <strong>完全连通分量</strong></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<p><strong><img alt="" src="https://assets.leetcode.com/uploads/2023/04/11/screenshot-from-2023-04-11-23-31-23.png" style="width: 671px; height: 270px;" /></strong></p>
<pre>
<strong>输入:</strong>n = 6, edges = [[0,1],[0,2],[1,2],[3,4]]
<strong>输出:</strong>3
<strong>解释:</strong>如上图所示,可以看到此图所有分量都是完全连通分量。
</pre>
<p><strong>示例 2</strong></p>
<p><strong><img alt="" src="https://assets.leetcode.com/uploads/2023/04/11/screenshot-from-2023-04-11-23-32-00.png" style="width: 671px; height: 270px;" /></strong></p>
<pre>
<strong>输入:</strong>n = 6, edges = [[0,1],[0,2],[1,2],[3,4],[3,5]]
<strong>输出:</strong>1
<strong>解释:</strong>包含节点 0、1 和 2 的分量是完全连通分量,因为每对节点之间都存在一条边。
包含节点 3 、4 和 5 的分量不是完全连通分量,因为节点 4 和 5 之间不存在边。
因此,在图中完全连接分量的数量是 1 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= n &lt;= 50</code></li>
<li><code>0 &lt;= edges.length &lt;= n * (n - 1) / 2</code></li>
<li><code>edges[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,40 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的字符串&nbsp;<code>details</code>&nbsp;<code>details</code>&nbsp;中每个元素都是一位乘客的信息,信息用长度为 <code>15</code>&nbsp;的字符串表示,表示方式如下:</p>
<ul>
<li>前十个字符是乘客的手机号码。</li>
<li>接下来的一个字符是乘客的性别。</li>
<li>接下来两个字符是乘客的年龄。</li>
<li>最后两个字符是乘客的座位号。</li>
</ul>
<p>请你返回乘客中年龄 <strong>严格大于 60 岁</strong>&nbsp;的人数。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>details = ["7868190130M7522","5303914400F9211","9273338290F4010"]
<b>输出:</b>2
<b>解释:</b>下标为 0 1 和 2 的乘客年龄分别为 75 92 和 40 。所以有 2 人年龄大于 60 岁。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>details = ["1313579440F2036","2921522980M5644"]
<b>输出:</b>0
<b>解释:</b>没有乘客的年龄大于 60 岁。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= details.length &lt;= 100</code></li>
<li><code>details[i].length == 15</code></li>
<li><code>details[i]</code>&nbsp;中的数字只包含&nbsp;<code>'0'</code>&nbsp;&nbsp;<code>'9'</code>&nbsp;</li>
<li><code>details[i][10]</code>&nbsp;<code>'M'</code>&nbsp;<code>'F'</code>&nbsp;或者&nbsp;<code>'O'</code>&nbsp;之一。</li>
<li>所有乘客的手机号码和座位号互不相同。</li>
</ul>

View File

@@ -0,0 +1,50 @@
<p>现给定一个函数 <code>fn</code> 和一个以毫秒为单位的时间 <code>t</code> ,请你返回该函数的 <strong>节流</strong> 版本。</p>
<p><strong>节流</strong> 函数首先立即被调用,然后在 <code>t</code> 毫秒的时间间隔内不能再次执行,但应该存储最新的函数参数,以便在延迟结束后使用这些参数调用 <code>fn</code></p>
<p>例如,<code>t = 50ms</code> ,并且函数在 <code>30ms</code><code>40ms</code><code>60ms</code> 时被调用。第一次函数调用会在接下来的 <code>t</code> 毫秒内阻止调用函数。第二次函数调用会保存参数,而第三次调用的参数应该覆盖当前保存的第二次调用的参数,因为第二次和第三次调用发生在 <code>80ms</code> 之前。一旦延迟时间过去,节流函数应该使用延迟期间提供的最新参数进行调用,并且还应创建另一个延迟期间,时长为 <code>80ms + t</code></p>
<p><img alt="Throttle Diagram" src="https://assets.leetcode.com/uploads/2023/04/08/screen-shot-2023-04-08-at-120313-pm.png" style="width: 1156px; height: 372px;" />上面的图示展示了节流如何转换事件。每个矩形代表100毫秒节流时间为400毫秒。每种颜色代表不同的输入集合。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>t = 100, calls = [{"t":20,"inputs":[1]}]
<b>输出:</b>[{"t":20,"inputs":[1]}]
<b>解释:</b>第一次调用总是立即执行,没有延迟。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>t = 50, calls = [{"t":50,"inputs":[1]},{"t":75,"inputs":[2]}]
<b>输出:</b>[{"t":50,"inputs":[1]},{"t":100,"inputs":[2]}]
<b>解释:</b>
第一次调用立即执行带有参数 (1) 的函数。
第二次调用发生在 75毫秒 时,在延迟期间内,因为 50毫秒 + 50毫秒 = 100毫秒所以下一次调用可以在 100毫秒 时执行。因此,我们保存第二次调用的参数,以便在第一次调用的回调函数中使用。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>t = 70, calls = [{"t":50,"inputs":[1]},{"t":75,"inputs":[2]},{"t":90,"inputs":[8]},{"t": 140, "inputs":[5,7]},{"t": 300, "inputs": [9,4]}]
<b>输出:</b>[{"t":50,"inputs":[1]},{"t":120,"inputs":[8]},{"t":190,"inputs":[5,7]},{"t":300,"inputs":[9,4]}]
<b>解释:</b>
第一次调用立即执行带有参数 (1) 的函数。
第二次调用发生在 75毫秒 时,在延迟期间内,因为 50毫秒 + 70毫秒 = 120毫秒所以它只应保存参数。
第三次调用也在延迟期间内,因为我们只需要最新的函数参数,所以覆盖之前的参数。延迟期过后,在 120毫秒时进行回调并使用保存的参数进行调用。该回调会创建另一个延迟期间时长为 120毫秒 + 70毫秒 = 190毫秒以便下一个函数可以在 190毫秒时调用。
第四次调用发生在 140毫秒在延迟期间内因此应在190毫秒时作为回调进行调用。这将创建另一个延迟期间时长为 190毫秒 + 70毫秒 = 260毫秒。
第五次调用发生在 300毫秒但它是在 260毫秒 之后,所以应立即调用,并创建另一个延迟期间,时长为 300毫秒 + 70毫秒 = 370毫秒。</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>0 &lt;= t &lt;= 1000</code></li>
<li><code>1 &lt;= calls.length &lt;= 10</code></li>
<li><code>0 &lt;= calls[i].t &lt;= 1000</code></li>
<li><code>0 &lt;= calls[i].inputs[i], calls[i].inputs.length &lt;= 10</code></li>
</ul>

View File

@@ -0,0 +1,42 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>nums</code>&nbsp;,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 <strong>力量</strong>&nbsp;定义为:</p>
<ul>
<li><code>i<sub>0</sub></code>&nbsp;<code>i<sub>1</sub></code>&nbsp;<span style="">... </span><code><span style="">i<sub>k</sub></span></code><span style="">&nbsp;</span>表示这组英雄在数组中的下标。那么这组英雄的力量为&nbsp;<code><font face="monospace">max(nums[</font>i<sub>0</sub><font face="monospace">],nums[</font>i<sub>1</sub><font face="monospace">] ... nums[</font><span style="font-size:10.8333px">i<sub>k</sub></span><font face="monospace">])<sup>2</sup> * min(nums[</font>i<sub>0</sub><font face="monospace">],nums[</font>i<sub>1</sub><font face="monospace">] ... nums[</font><span style="font-size:10.8333px">i<sub>k</sub></span><font face="monospace">])</font></code></li>
</ul>
<p>请你返回所有可能的 <strong>非空</strong> 英雄组的 <strong>力量</strong> 之和。由于答案可能非常大,请你将结果对&nbsp;<code>10<sup>9 </sup>+ 7</code>&nbsp;<strong>取余。</strong></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>nums = [2,1,4]
<b>输出:</b>141
<b>解释:</b>
第 1&nbsp;组:[2] 的力量为 2<sup>2</sup>&nbsp;* 2 = 8 。
第 2&nbsp;组:[1] 的力量为 1<sup>2</sup> * 1 = 1 。
第 3&nbsp;组:[4] 的力量为 4<sup>2</sup> * 4 = 64 。
第 4&nbsp;组:[2,1] 的力量为 2<sup>2</sup> * 1 = 4 。
第 5 组:[2,4] 的力量为 4<sup>2</sup> * 2 = 32 。
第 6&nbsp;组:[1,4] 的力量为 4<sup>2</sup> * 1 = 16 。
第​ 7&nbsp;组:[2,1,4] 的力量为 4<sup>2</sup> * 1 = 16 。
所有英雄组的力量之和为 8 + 1 + 64 + 4 + 32 + 16 + 16 = 141 。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>nums = [1,1,1]
<b>输出:</b>7
<b>解释:</b>总共有 7 个英雄组,每一组的力量都是 1 。所以所有英雄组的力量之和为 7 。
</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,46 @@
<p>请你写一个函数&nbsp;<code>createCounter</code>. 这个函数接收一个初始的整数值 <code>init</code>&nbsp;&nbsp;并返回一个包含三个函数的对象。</p>
<p>这三个函数是:</p>
<ul>
<li><code>increment()</code>&nbsp;将当前值加 1 并返回。</li>
<li><code>decrement()</code>&nbsp;将当前值减 1 并返回。</li>
<li><code>reset()</code>&nbsp;将当前值设置为 <code>init</code> 并返回。</li>
</ul>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>init = 5, calls = ["increment","reset","decrement"]
<b>输出:</b>[6,5,4]
<strong>解释:</strong>
const counter = createCounter(5);
counter.increment(); // 6
counter.reset(); // 5
counter.decrement(); // 4
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>init = 0, calls = ["increment","increment","decrement","reset","reset"]
<b>输出:</b>[1,2,1,0,0]
<strong>解释:</strong>
const counter = createCounter(0);
counter.increment(); // 1
counter.increment(); // 2
counter.decrement(); // 1
counter.reset(); // 0
counter.reset(); // 0
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>-1000 &lt;= init &lt;= 1000</code></li>
<li><code>总调用次数不会超过&nbsp;1000</code></li>
</ul>

View File

@@ -0,0 +1,70 @@
<p>请你设计并实现一个能够对其中的值进行跟踪的数据结构,并支持对频率相关查询进行应答。</p>
<p>实现 <code>FrequencyTracker</code> 类:</p>
<ul>
<li><code>FrequencyTracker()</code>:使用一个空数组初始化 <code>FrequencyTracker</code> 对象。</li>
<li><code>void add(int number)</code>:添加一个 <code>number</code> 到数据结构中。</li>
<li><code>void deleteOne(int number)</code>:从数据结构中删除一个 <code>number</code> 。数据结构 <strong>可能不包含</strong> <code>number</code> ,在这种情况下不删除任何内容。</li>
<li><code>bool hasFrequency(int frequency)</code>: 如果数据结构中存在出现 <code>frequency</code> 次的数字,则返回 <code>true</code>,否则返回 <code>false</code></li>
</ul>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入</strong>
["FrequencyTracker", "add", "add", "hasFrequency"]
[[], [3], [3], [2]]
<strong>输出</strong>
[null, null, null, true]
<strong>解释</strong>
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.add(3); // 数据结构现在包含 [3]
frequencyTracker.add(3); // 数据结构现在包含 [3, 3]
frequencyTracker.hasFrequency(2); // 返回 true ,因为 3 出现 2 次
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入</strong>
["FrequencyTracker", "add", "deleteOne", "hasFrequency"]
[[], [1], [1], [1]]
<strong>输出</strong>
[null, null, null, false]
<strong>解释</strong>
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.add(1); // 数据结构现在包含 [1]
frequencyTracker.deleteOne(1); // 数据结构现在为空 []
frequencyTracker.hasFrequency(1); // 返回 false ,因为数据结构为空
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入</strong>
["FrequencyTracker", "hasFrequency", "add", "hasFrequency"]
[[], [2], [3], [1]]
<strong>输出</strong>
[null, false, null, true]
<strong>解释</strong>
FrequencyTracker frequencyTracker = new FrequencyTracker();
frequencyTracker.hasFrequency(2); // 返回 false ,因为数据结构为空
frequencyTracker.add(3); // 数据结构现在包含 [3]
frequencyTracker.hasFrequency(1); // 返回 true ,因为 3 出现 1 次
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= number &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= frequency &lt;= 10<sup>5</sup></code></li>
<li>最多调用 <code>add</code><code>deleteOne</code><code>hasFrequency</code> <strong>共计</strong> <code>2 *&nbsp;10<sup>5</sup></code></li>
</ul>