Skip to content

Commit a715d6e

Browse files
committed
feat: 第490场周赛
1 parent f9fc331 commit a715d6e

5 files changed

Lines changed: 231 additions & 0 deletions

File tree

leetcode/5-周赛/Readme.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# 力扣周赛记录
22

3+
## 第 490 场周赛
4+
5+
**时间**:2026-02-22
6+
7+
**竞赛分数**:📈1653 / 692
8+
9+
**总结**:这次周赛整体难度不大,全部做出来了,继续加油。
10+
11+
|序号| 题目名称 | 通过数据点 | 知识点 |
12+
|---| -------------- | --- | --- |
13+
| 1 | [3847. 计算比赛分数差](/leetcode/5-周赛/第%20490%20场周赛/3847.%20计算比赛分数差.md) | 100% | 模拟 |
14+
| 2 | [3848. 阶数数字排列](/leetcode/5-周赛/第%20490%20场周赛/3848.%20阶数数字排列.md) | 100% | 数学 |
15+
| 3 | [3849. 重新排列后的最大按位异或值](/leetcode/5-周赛/第%20490%20场周赛/3849.%20重新排列后的最大按位异或值.md) | 100% | 贪心 |
16+
| 4 | [3850. 统计结果等于 K 的序列数目](/leetcode/5-周赛/第%20490%20场周赛/3850.%20统计结果等于%20K%20的序列数目.md) | 100% | 记忆化搜索 |
317

418
## 第 428 场周赛
519

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# [3847. 计算比赛分数差](https://leetcode.cn/problems/find-the-score-difference-in-a-game/)
2+
3+
> **日期**:2026-02-23
4+
> **所用时间**:10min
5+
> **知识点**:模拟
6+
7+
## 1. 题目描述
8+
9+
给定一个整数数组 `nums`,按顺序模拟一场两人比赛的计分过程,计算最终两人分数之差。
10+
11+
**规则:**
12+
13+
- 初始两个分数 `s1``s2` 均为 0,当前加分的「对象」为 `s1`
14+
- 从左到右遍历 `nums`,对于下标为 `i`、数值为 `x` 的元素:
15+
-`x`**奇数**,则先交换「当前加分对象」与另一人(即 `s1``s2` 互换角色),再给当前对象加上 `x`
16+
-`(i + 1) % 6 == 0`(即第 6、12、18… 个元素),同样先交换一次加分对象,再给当前对象加上 `x`
17+
- 其余情况直接给当前对象加上 `x`
18+
- 返回最终**先手方分数减后手方分数**的差值(根据过程中交换次数的奇偶性确定谁算「先手」)。
19+
20+
**示例:**
21+
22+
(可根据题意补充具体输入输出;若题目为「先手减后手」则差值为 `s1 - s2``s2 - s1` 依交换次数奇偶而定。)
23+
24+
**提示:**
25+
26+
- `1 <= nums.length <= 10^5`
27+
- `1 <= nums[i] <= 10^5`
28+
29+
## 2. 模拟 + 双变量交替
30+
31+
`s1``s2` 表示当前两人的分数,用 `change` 记录「交换次数」。遍历时:遇奇数或 `(i+1)%6==0` 则交换 `s1``s2` 并令 `change += 1`;每次将当前数加到 `s1`
32+
33+
最后若 `change` 为偶数则先手对应 `s1`,否则先手对应 `s2`,返回先手分数减后手分数的差值。
34+
35+
复杂度分析:
36+
37+
- 时间复杂度:$O(n)$。
38+
- 空间复杂度:$O(1)$。
39+
40+
**Python3**
41+
42+
```python
43+
class Solution:
44+
def scoreDifference(self, nums: List[int]) -> int:
45+
s1 = s2 = 0
46+
change = 0
47+
for i, x in enumerate(nums):
48+
if x % 2 == 1:
49+
s1, s2 = s2, s1
50+
change += 1
51+
if (i + 1) % 6 == 0:
52+
s1, s2 = s2, s1
53+
change += 1
54+
s1 += x
55+
return s1 - s2 if change % 2 == 0 else s2 - s1
56+
```
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# [3848. 阶数数字排列](https://leetcode.cn/problems/check-digitorial-permutation/)
2+
3+
> **日期**:2026-02-22
4+
> **所用时间**:10min
5+
> **知识点**:数学
6+
7+
## 1. 题目描述
8+
9+
给定一个正整数 `n`,定义其**阶数和**为:将 `n` 的每一位数字的阶乘相加得到的数。例如 `n = 145` 时,阶数和为 `1! + 4! + 5! = 1 + 24 + 120 = 145`
10+
11+
判断:`n` 的阶数和 `s``n` 是否由**相同的一组数字**组成(即 `s` 的各位数字重排后能否得到 `n`,或等价地,`sorted(str(s)) == sorted(str(n))`)。
12+
13+
**示例 1:**
14+
15+
```
16+
输入:n = 145
17+
输出:true
18+
解释:1!+4!+5! = 145,145 与 145 数字相同。
19+
```
20+
21+
**示例 2:**
22+
23+
```
24+
输入:n = 12
25+
输出:false
26+
解释:1!+2! = 3,数字 "3" 与 "12" 不同。
27+
```
28+
29+
**提示:**
30+
31+
- `1 <= n <= 10^9`(或题目给定范围)
32+
33+
## 2. 阶乘求和 + 数字集合比较
34+
35+
先定义阶乘 `f(x) = x!``f(0)=1`),用记忆化避免重复计算。将 `n` 的每一位数字的阶乘相加得到 `s`,再比较 `s``n`**数字多重集**是否相同:即 `sorted(str(s)) == sorted(str(n))`
36+
37+
复杂度分析:
38+
39+
- 时间复杂度:$O(\log n)$(位数),阶乘计算为常数次(0~9)。
40+
- 空间复杂度:$O(1)$(阶乘缓存与数字串)。
41+
42+
**Python3**
43+
44+
```python
45+
class Solution:
46+
def isDigitorialPermutation(self, n: int) -> bool:
47+
@cache
48+
def f(x):
49+
if x == 0:
50+
return 1
51+
return x * f(x - 1)
52+
53+
s = sum(f(int(c)) for c in str(n))
54+
return sorted(str(s)) == sorted(str(n))
55+
```
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# [3849. 重新排列后的最大按位异或值](https://leetcode.cn/problems/maximum-bitwise-xor-after-rearrangement/)
2+
3+
> **日期**:2026-02-22
4+
> **所用时间**:25min
5+
> **知识点**:贪心、计数
6+
7+
## 1. 题目描述
8+
9+
给定两个**二进制字符串** `s``t`,长度相同。你可以**任意重排** `t` 中的字符。将重排后的 `t``s` **按位异或**(即第 i 位为 `s[i] ^ t[i]`),得到一个二进制串。求在所有重排方案中,该异或结果**数值最大**时对应的二进制串(通常也等价于字典序最大)。
10+
11+
**示例 1:**
12+
13+
```
14+
输入:s = "010", t = "110"
15+
输出:"101"
16+
解释:将 t 重排为 "101",与 s 按位异或得 010^101 = 111;或重排为 "011" 得 001,最大为 "111"。若输出为 "101" 则可能表示某种题意下的最大异或串。
17+
```
18+
19+
**示例 2:**
20+
21+
```
22+
输入:s = "0", t = "0"
23+
输出:"0"
24+
解释:无法得到 1,结果为 "0"。
25+
```
26+
27+
**提示:**
28+
29+
- `1 <= s.length, t.length <= 10^5`
30+
- `s``t` 仅由 `'0'``'1'` 组成
31+
32+
## 2. 贪心 + 计数
33+
34+
要使异或结果最大,应尽量在**高位**得到 `1`。从左到右遍历 `s` 的每一位:当前位若为 `c`,则异或为 1 当且仅当该位与 `1-c`(相反位)配对。
35+
36+
用计数器维护 `t` 中剩余可用的 `'0'``'1'` 个数;每步优先使用与当前位相反的字符(若还有),则当前位异或为 1,否则为 0。这样得到的就是字典序(数值)最大的异或串。
37+
38+
- **时间复杂度**:$O(n)$,n 为串长。
39+
- **空间复杂度**:$O(1)$(仅计数)。
40+
41+
**Python3**
42+
43+
```python
44+
class Solution:
45+
def maximumXor(self, s: str, t: str) -> str:
46+
cnt = Counter(t)
47+
if cnt['1'] == 0:
48+
return s
49+
50+
ans = ''
51+
for c in s:
52+
reverse = str(1-int(c))
53+
ans += '1' if cnt[reverse] > 0 else '0'
54+
cnt[reverse] -= 1
55+
return ans
56+
```
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# [3850. 统计结果等于 K 的序列数目](https://leetcode.cn/problems/count-sequences-to-k/)
2+
3+
> **日期**:2026-02-22
4+
> **所用时间**:30min
5+
> **知识点**:记忆化搜索、DFS
6+
7+
## 1. 题目描述
8+
9+
给定一个整数数组 `nums` 和一个整数 `k`。对每个下标 `i`,你可以从三种操作中任选其一:**不选**该数、将当前结果**乘以** `nums[i]`、或将当前结果**除以** `nums[i]`(整除或浮点除依题意)。每个位置至多使用一次。
10+
11+
求有多少种**操作序列**,使得按顺序执行后得到的**结果等于** `k`
12+
13+
(若题意为「从右到左」或「表达式结果为 k」等变种,逻辑等价:用当前值 `k` 倒推,DFS 时枚举不选 / 乘 / 除三种后继状态,边界为下标越界时检查当前值是否为 1 或 k。)
14+
15+
**示例 1:**
16+
17+
```
18+
输入:nums = [2, 3, 4], k = 6
19+
输出:(依题意计算)
20+
解释:例如 2 * 3 = 6、或 4 不选且 2*3=6 等,统计所有使结果等于 k 的序列数。
21+
```
22+
23+
**提示:**
24+
25+
- `1 <= nums.length <= 30`
26+
- `1 <= nums[i], k <= 10^9`(或题目给定范围)
27+
28+
## 2. 记忆化 DFS
29+
30+
从右到左(或从左到右)枚举下标 `i`,当前「目标值」为 `k`:若已处理完所有元素(`i < 0`),则若当前目标为 1 则贡献 1 种方案,否则 0;否则三种分支:不选 `nums[i]`(目标仍为 `k`)、选乘(目标变为 `k / nums[i]`)、选除(目标变为 `k * nums[i]`)。
31+
32+
`@cache` 记忆化 `(i, k)` 的答案,避免重复计算。注意浮点比较时用 `abs(1 - k) < 1e-5` 等判等。
33+
34+
复杂度分析:
35+
36+
- 时间复杂度:$O(n \cdot S)$,其中 $S$ 为状态数(与 k 的因子或离散化后的状态数相关)。
37+
- 空间复杂度:$O(n \cdot S)$,为记忆化缓存。
38+
39+
**Python3**
40+
41+
```python
42+
class Solution:
43+
def countSequences(self, nums: List[int], k: int) -> int:
44+
@cache
45+
def dfs(i, k):
46+
if i < 0:
47+
return int(abs(1 - k) < 1e-5)
48+
return dfs(i - 1, k) + dfs(i - 1, k * nums[i]) + dfs(i - 1, k / nums[i])
49+
return dfs(len(nums) - 1, k)
50+
```

0 commit comments

Comments
 (0)