【备战秋招】小米25届秋招笔试真题第二套
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线90+套真题改编解析,后续会持续更新的
春秋招笔试机考合集 -> 互联网必备刷题宝典🔗
题目一:括号匹配大师
1️⃣:理解卡特兰数的组合数学含义,计算合法括号序列数量
2️⃣:考虑多种括号类型的选择,使用快速幂计算
3️⃣:结合卡特兰数递推公式和模逆元进行高效计算
难度:中等
这道题目考查卡特兰数的经典应用。关键在于认识到长度为 的合法括号串需要
对括号,每对括号有
种选择。通过卡特兰数计算配对方案数,再乘以类型选择数,得到最终答案
。
题目二:小基的魔法硬币翻转
1️⃣:将问题转化为最大子段和问题,0视为+1,1视为-1
2️⃣:使用Kadane算法找到最大子段和及其位置
3️⃣:结合原始1的数量计算最终答案
难度:中等
这道题目巧妙地将硬币翻转问题转化为经典的最大子段和问题。通过合理的转换(0→+1,1→-1),使得原问题变为寻找和最大的连续子数组。Kadane算法能够在 时间内高效解决,同时记录最优区间位置。
01. 括号匹配大师
问题描述
小基 是一名程序员,她最近在研究括号匹配问题。在编程语言中,常见的括号包括圆括号 、方括号
、花括号
等。小基 发现,一个合法的括号串需要满足以下三个条件之一:
- 该括号串是空串。
- 该括号串形如
,其中
和
是一对匹配的括号(即
为左括号,
为右括号),而
是一个合法的括号串。
- 该括号串形如
,其中
和
都是合法的括号串。
现在,小基 想知道:给定可使用的括号种类数 和括号串长度
,有多少种不同的合法括号串可以组成?由于答案可能很大,小基 只需要知道答案对
取模的结果。
输入格式
输入一行,包含两个正整数 和
,分别表示括号串的长度和允许使用的括号种类数。
输出格式
输出一个整数,表示长度为 的合法括号串的数量对
取模的结果。
样例输入
6 2
样例输出
40
数据范围
- 输入保证
为偶数
样例 | 解释说明 |
---|---|
样例1 | 当 |
题解
这道题本质上是一个组合数学问题,核心是卡特兰数的应用。
首先理解什么是合法的括号串。从题目描述可以看出,合法括号串必须满足每个左括号都有对应的右括号匹配,且在任意前缀中,左括号数量不少于右括号数量。
关键观察:对于长度为 的括号串,我们实际上需要
对括号。每对括号的类型有
种选择。
解题思路分为两个部分:
-
计算括号配对方案数:这就是经典的卡特兰数问题。对于
对括号,合法的配对方案数为第
个卡特兰数
。卡特兰数可以用递推公式计算:
,其中
。
-
计算括号类型选择数:每对括号都有
种类型可以选择,所以总的类型选择方案数为
。
最终答案就是:。
算法步骤:
- 初始化卡特兰数
- 通过循环计算第
个卡特兰数
- 计算
的
次幂
- 将两者相乘得到最终结果
时间复杂度为 ,空间复杂度为
,对于给定的数据范围完全可以接受。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
# 读取输入数据
n, k = map(int, input().split())
mod = 998244353
# 计算模逆元的快速幂函数
def pow_mod(base, exp, m):
res = 1
base %= m
while exp > 0:
if exp & 1:
res = res * base % m
base = base * base % m
exp >>= 1
return res
# 计算逆元
def inv(x):
return pow_mod(x, mod - 2, mod)
# 计算第 n/2 个卡特兰数
m = n // 2
cat = 1
for i in range(m):
cat = cat * (4 * i + 2) % mod
cat = cat * inv(i + 2) % mod
# 计算 k^(n/2)
k_pow = pow_mod(k, m, mod)
# 最终结果
ans = cat * k_pow % mod
print(ans)
solve()
- Cpp
#include
using namespace std;
const int MOD = 998244353;
// 快速幂函数
long long qpow(long long a, long long b) {
long long res = 1;
a %= MOD;
while (b > 0) {
if (b & 1) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}
// 计算逆元
long long inv(long long x) {
return qpow(x, MOD - 2);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
int m = n / 2;
long long cat = 1;
// 计算卡特兰数
for (int i = 0; i < m; i++) {
cat = cat * (4LL * i + 2) % MOD;
cat = cat * inv(i + 2) % MOD;
}
// 计算 k 的 m 次幂
long long k_pow = qpow(k, m);
// 输出结果
long long ans = cat * k_pow % MOD;
cout << ans << endl;
return 0;
}
- Java
import java.util.Scanner;
public class Main {
static final int MOD = 998244353;
// 快速幂函数
static long powMod(long base, long exp) {
long result = 1;
base %= MOD;
while (exp > 0) {
if ((exp & 1) == 1) {
result = result * base % MOD;
}
base = base * base % MOD;
exp >>= 1;
}
return result;
}
// 计算逆元
static long modInv(long x) {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力