【秋招笔试】2025.08.21蚂蚁秋招算法岗机考改编题
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线140+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
题目一:小兰的魔法水晶分配
1️⃣:分析奇偶性,奇数时使用
的组合
2️⃣:偶数时使用
或特殊情况处理
难度:中等
这道题目的关键在于理解合数的性质,并发现通过奇偶性分类讨论可以构造出最优解。对于大部分情况,都可以用两块水晶解决,只有少数特殊值需要更多水晶。通过数学分析,避免了复杂的质数判断,实现 O(1) 的高效解法。
题目二:小毛的餐厅推荐系统
1️⃣:使用标准的文本预处理流程统一格式
2️⃣:应用 CountVectorizer 和 TfidfTransformer 进行特征工程
3️⃣:使用逻辑回归模型进行二分类预测
难度:中等
这道题目结合了自然语言处理和机器学习技术,需要掌握 sklearn 库的基本使用方法。通过 Pipeline 将整个流程串联,体现了机器学习项目的标准化处理思路。关键在于理解文本分类的完整流程和各个参数的含义。
题目三:小基的游戏得分分析
1️⃣:使用前缀和快速计算区间和
2️⃣:模拟删除操作构造新序列
3️⃣:应用滑动窗口算法寻找最优区间
难度:中等偏难
这道题目需要理解独立查询的概念,并设计高效的数据结构来处理区间操作。通过前缀和优化区间和计算,用滑动窗口避免重复计算,实现了在限定复杂度内的最优解法。关键技巧是将问题转化为在新序列上的滑动窗口查找。
01. 小兰的魔法水晶分配
问题描述
小兰是一位著名的魔法师,她拥有一种特殊的魔法水晶。这种水晶有两种类型:纯净水晶(用数字 表示)和复合水晶(用合数表示)。小兰需要制作一个魔法阵,魔法阵要求使用的水晶总能量值恰好为
,并且为了保证魔法阵的稳定性,至少需要使用
块水晶。
为了节省材料成本,小兰希望使用的水晶块数尽可能少。如果有多种使用相同最少块数的方案,她可以选择其中任意一种。
输入格式
第一行包含一个正整数 (
),表示测试数据组数。
接下来 行,每行包含一个正整数
(
),表示魔法阵需要的总能量值。
输出格式
对于每组测试数据,输出两行:
第一行输出一个正整数 ,表示使用的水晶块数。
第二行输出 个正整数,表示每块水晶的能量值。
样例输入
3
8
10
2
样例输出
2
4 4
2
1 9
2
1 1
数据范围
| 样例 | 解释说明 |
|---|---|
| 样例1 | |
| 样例2 | |
| 样例3 |
题解
这道题的核心是要理解纯净水晶和复合水晶的性质。纯净水晶的能量值为 ,复合水晶的能量值为合数(大于
且不是质数的数)。
关键观察:
- 如果
是奇数且
,那么
是偶数且大于等于
,必然是合数,所以可以用
两块水晶。
- 如果
是偶数且
,那么
和
都是合数,可以用
两块水晶。
- 对于特殊的小值:
:只能用
:只能用
:只能用
:只能用
这种构造方法能保证使用最少的水晶块数,时间复杂度为 。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
# 读取测试用例数量
t = int(input())
while t > 0:
n = int(input())
# 检查小值特殊情况
if n == 2:
print(2)
print("1 1")
elif n == 3:
print(3)
print("1 1 1")
elif n % 2 == 1: # 奇数情况,n >= 5
print(2)
print(f"1 {n-1}")
else: # 偶数情况
if n >= 8:
print(2)
print(f"{n-4} 4")
elif n == 4:
print(4)
print("1 1 1 1")
else: # n == 6
print(3)
print("1 1 4")
t -= 1
solve()
- Cpp
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
ll n;
cin >> n;
// 处理特殊的小值情况
if (n == 2) {
cout << "2\n1 1\n";
} else if (n == 3) {
cout << "3\n1 1 1\n";
} else if (n & 1) { // 奇数且 >= 5
cout << "2\n1 " << n - 1 << "\n";
} else { // 偶数
if (n >= 8) {
cout << "2\n" << n - 4 << " 4\n";
} else if (n == 4) {
cout << "4\n1 1 1 1\n";
} else { // n == 6
cout << "3\n1 1 4\n";
}
}
}
return 0;
}
- Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int testCase = scanner.nextInt();
while (testCase-- > 0) {
long num = scanner.nextLong();
// 处理各种情况
if (num == 2) {
System.out.println("2");
System.out.println("1 1");
} else if (num == 3) {
System.out.println("3");
System.out.println("1 1 1");
} else if (num % 2 == 1) { // 奇数且 >= 5
System.out.println("2");
System.out.println("1 " + (num - 1));
} else { // 偶数
if (num >= 8) {
System.out.println("2");
System.out.println((num - 4) + " 4");
} else if (num == 4) {
System.out.println("4");
System.out.println("1 1 1 1");
} else { // num == 6
System.out.println("3");
System.out.println("1 1 4");
}
}
}
scanner.close();
}
}
02. 小毛的餐厅推荐系统
问题描述
小毛经营着一家美食评价网站,他需要开发一个智能推荐系统来分析顾客对餐厅的评价。系统需要根据顾客的文本评价自动判断是好评()还是差评(
)。
为了确保系统的准确性,小毛决定使用机器学习方法,具体流程如下:
- 数据预处理:将评价文本统一转换为小写,去除首尾空白字符,并将多个连续空格合并为单个空格
- 特征提取:使用
元组的词袋模型(
),设置
,然后应用
变换
- 模型训练:使用逻辑回归(
),参数设置为:
,
,
,
,
- 预测:如果正类概率
,则判断为好评(
),否则为差评(
)
输入格式
输入为一个 JSON 格式的字符串,包含两个字段:
:训练数据,每个元素为
的格式,其中标签为
(差评)或
(好评)
:测试数据,包含需要预测的评价文本列表
输出格式
输出一个 JSON 数组,按顺序包含对测试集中每条评价的预测结果( 或
)。
样例输入
{"train":[["good movie", 1],["great film",1],["bad movie",0],["terrible fiim",0]], "test":["good film", "bad film"]}
样例输出
[1,0]
数据范围
- 训练数据量
- 评价文本长度适中,适合文本分类任务
- 所有随机过程均设置
以确保结果可重现
| 样例 | 解释说明 |
|---|---|
| 样例1 | 训练集包含"good movie"(好评)、"great film"(好评)、"bad movie"(差评)、"terrible film"(差评),测试"good film"预测为好评(1),"bad film"预测为差评(0) |
题解
这道题考查的是文本分类的经典流程,需要用到机器学习中的自然语言处理技术。
核心步骤分析:
-
文本预处理:标准化文本格式,确保数据一致性。使用
lower()转小写,strip()去首尾空白,split()然后重新join()来合并多余空格。 -
特征工程:使用词袋模型提取特征。
CountVectorizer的ngram_range=(1,2)表示同时考虑单词和双词组合,min_df=1表示词频阈值为1。接着用TfidfTransformer进行 TF-IDF 变换,这样可以降低高频词的权重,提升模型效果。 -
模型训练:逻辑回归是文本分类的经典算法,参数设置都按题目要求固定,确保可重现性。
-
预测过程:使用
predict_proba()获取正类概率,然后根据 0.5 阈值判断分类结果。
使用 Pipeline 可以将整个流程串联起来,代码更加简洁高效。时间复杂度主要取决于文本长度和训练数据量,对于给定数据规模完全可以接受。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
import json
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
def clean_text(text):
# 文本标准化:转小写,去首尾空白,合并多余空格
return " ".join(text
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力