【秋招笔试】2025.08.24蚂蚁秋招算法岗笔试真题改编
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线140+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
题目一:古代宝藏密码
1️⃣:将二次方程转化为寻找正整数解的问题
2️⃣:利用奇数性质推导出直接构造公式
3️⃣:处理边界情况,当n=1时无解
难度:简单
这道题目的关键在于识别数学规律,通过代数变换将复杂的二次方程转化为简单的构造问题。利用奇数的性质,可以直接推导出解的公式,避免复杂的数值计算,实现 O(1) 的高效解法。
题目二:智能家居控制系统
1️⃣:实现缩放点积注意力机制的矩阵运算
2️⃣:处理JSON格式输入输出和数值稳定的softmax
3️⃣:利用NumPy进行高效的矩阵计算和结果展平
难度:中等
这道题目结合了机器学习算法和工程实现,需要理解注意力机制的计算流程。通过NumPy的矩阵运算,实现从相似度计算到权重聚合的完整流程,重点在于数值稳定性和JSON数据处理。
题目三:团队协作效率评估
1️⃣:设计动态规划状态表示最大分组数量
2️⃣:利用GCD性质优化状态转移,避免O(n²)复杂度
3️⃣:维护GCD值列表,实现O(n log A)的高效算法
难度:困难
这道题目需要深度理解GCD函数的性质,通过观察发现固定右端点的所有区间GCD值种类有限。运用动态规划思想结合数论优化,将朴素的O(n²)算法优化到O(n log A),展现了算法优化的精妙之处。
01. 古代宝藏密码
问题描述
小兰是一位考古学家,最近发现了一本古代密码书。书中记载着一种特殊的宝藏定位方法:
给定一个奇数编号 ,需要找到两个正整数坐标
,使得它们满足古代公式:
如果能找到满足条件的坐标对,就能定位到宝藏的位置;如果找不到,说明这个编号对应的区域没有宝藏。
输入格式
第一行包含一个正整数 (
),表示需要检查的区域数量。
接下来 行,每行包含一个正整数
(
),表示一个奇数区域编号。
输出格式
对于每个区域编号,输出一行:
-
如果存在满足条件的坐标对
,输出两个正整数
和
-
如果不存在,输出
如果存在多个解,输出任意一个即可。
样例输入
2
1
13
样例输出
-1
2 9
样例 | 解释说明 |
---|---|
样例1 | 区域编号1无法找到满足条件的正整数坐标对,输出-1 |
样例2 | 区域编号13可以找到坐标对(2,9)或(6,7)等,输出任意一个即可 |
数据范围
- 保证
为奇数
题解
这道题看起来是在解一个二次方程,但其实有很巧妙的数学规律可以直接利用。
首先分析方程 ,可以整理为:
由于 是奇数,可以设
(其中
),那么:
现在的关键是要找到两个正整数 和
,使得
。
通过观察可以发现一个巧妙的构造方法:
- 设
- 设
验证: ✓
但要注意边界情况:当 时,
,得到
。由于题目要求正整数,
不符合条件,所以
时无解。
对于所有 的奇数,都存在解:
。
算法步骤:
- 检查
是否等于 1,如果是则输出 -1
- 否则计算
,
,输出
和
时间复杂度 ,空间复杂度
。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
t = int(input())
for _ in range(t):
n = int(input())
# 特殊情况:n=1时无解
if n == 1:
print(-1)
else:
# 利用数学公式直接计算
x = (n + 1) // 2 # 第一个坐标
y = (n - 1) // 2 # 第二个坐标
print(x, y)
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
long long n;
cin >> n;
// 边界情况检查
if (n == 1) {
cout << -1 << "\n";
} else {
// 使用数学公式计算坐标
long long x = (n + 1) / 2; // 第一个坐标
long long y = (n - 1) / 2; // 第二个坐标
cout << x << " " << y << "\n";
}
}
return 0;
}
- Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int testCases = sc.nextInt();
while (testCases-- > 0) {
long n = sc.nextLong();
// 处理特殊情况
if (n == 1) {
System.out.println(-1);
} else {
// 根据数学推导计算坐标
long coordX = (n + 1) / 2; // 第一个坐标
long coordY = (n - 1) / 2; // 第二个坐标
System.out.println(coordX + " " + coordY);
}
}
sc.close();
}
}
02. 智能家居控制系统
问题描述
小毛正在开发一套智能家居控制系统。系统需要根据用户的查询指令、设备特征和设备状态来智能调节家居设备。
系统的工作流程如下:
-
相似度计算:计算查询指令
与设备特征
的匹配度
,其中
是特征维度
-
权限过滤:如果提供了权限掩码
,将其添加到匹配度矩阵中。掩码值为
表示允许访问,
表示禁止访问
-
权重标准化:对每行进行数值稳定的 softmax 操作
-
状态聚合:通过加权求和计算最终控制指令
,其中
是设备状态矩阵
-
指令输出:将结果矩阵
按行优先顺序展平为一维控制指令
输入格式
输入为单行 JSON 格式,包含以下字段:
{
"Q": [[...], ...], // 查询指令矩阵,形状 (m,d)
"K": [[...], ...], // 设备特征矩阵,形状 (n,d)
"V": [[...], ...], // 设备状态矩阵,形状 (n,d_v),本题中 d_v = d
"mask": [[...], ...] or null // 权限掩码矩阵,形状 (m,n),可为 null
}
其中:
-
,
-
所有数值为实数
-
如果 "mask" 为 null,视为全零矩阵
输出格式
输出单行 JSON 数组,数值保留 6 位小数。
样例输入
{"Q":[[1,0]],"K":[[1,0]],"V":[[5,5]],"mask":null}
样例输出
[5.0,5.0]
样例 | 解释说明 |
---|---|
样例1 | 查询[1,0]与特征[1,0]完全匹配,权重为1,输出状态[5,5] |
数据范围
- 所有输入值为实数
- 仅允许使用 NumPy 实现
题解
这道题要求实现一个类似注意力机制的智能家居控制算法。虽然看起来复杂,但步骤非常清晰。
核心思想是通过查询指令和设备特征的相似度来决定如何聚合设备状态,产生最终的控制指令。
算法步骤:
- 计算相似度矩阵:
,这里使用了缩放点积来避免梯度消失
- 应用权限掩码:如果有掩码,将其加到相似度矩阵上
- 数值稳定的 softmax:先减去每行最大值再计算 exp 和归一化,避免数值溢出
- 加权聚合:用权重矩阵对设备状态进行加权平均
- 结果展平:按行优先顺序将二维结果转为一维数组
由于数据规模很小(最大 3×4),直接使用 NumPy 矩阵运算即可高效完成。
关键技巧:
- 使用 `@ 运算符进行矩阵乘法
- 利用
keepdims=True
保持维度进行广播 - 通过减去最大值实现数值稳定的 softmax
时间复杂度 ,在给定数据范围内可以忽略不计。
参考代码
- Python
import sys
import json
import math
import numpy as np
def main():
# 读取输入并解析JSON
line = sys.stdin.readline().strip()
data = json.loads(line)
# 提取矩阵数据
Q = np.array(data["Q"], dtype=float) # 查询指令 (m,d)
K = np.array(data["K"], dtype=float) # 设备特征 (n,d)
V = np.array(data["V"], dtype=float) # 设备状态 (n,d)
# 处理权限掩码
mask_data = data.get("mask")
if mask_data is None:
mask = np.zeros((Q.shape[0], K.shape[0]), dtype=float)
else:
mask = np.array(mask_data, dtype=float)
# 计算缩放点积相似度
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力