【秋招笔试】2025.09.07蚂蚁算法岗秋招笔试改编
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
蚂蚁-09.07
题目一:神秘密码的最优解码
1️⃣:计算数组所有元素的按位或运算结果
2️⃣:利用按位或运算的性质,答案即为数组按位或的结果
难度:中等
这道题目的关键在于理解按位或运算的性质,发现对于要求 最小的问题,
只能在
已有的1位上取值,从而得到
的巧妙结论。通过数学分析,避免了暴力搜索,实现了
的高效解法。
题目二:智能投资顾问系统
1️⃣:解析JSON格式的训练和测试数据
2️⃣:使用StandardScaler进行数据标准化预处理
3️⃣:构建RandomForestClassifier模型并训练预测
难度:中等
这道题目结合了数据预处理和机器学习算法,需要掌握scikit-learn库的使用方法。通过随机森林算法的ensemble特性,能够有效处理分类问题并提供稳定的预测结果。关键在于正确的数据流处理和参数设置。
题目三:电子竞技联赛策略规划
1️⃣:定义动态规划状态表示从当前位置开始的最大期望收益
2️⃣:考虑"参加"和"跳过"两种决策的期望值计算
3️⃣:从后往前递推求解最优策略
难度:中等偏难
这道题目需要理解概率与期望的计算,并设计合适的动态规划状态转移。核心难点在于处理"强制休息"机制对后续决策的影响,通过期望值的线性性质,将复杂的概率问题转化为清晰的递推关系,实现 的时间复杂度。
01. 神秘密码的最优解码
问题描述
小兰是一名密码学专家,她发现了一个古老的密码系统。这个系统中有一个由 个正整数组成的密钥序列
。
为了破解这个密码,小兰需要选择一个非负整数 作为解码密钥,但是这个选择必须满足两个严格的条件(按优先级排序):
-
与密钥序列所有元素按位或运算的结果
必须尽可能小
-
在满足条件1的前提下,
的值必须尽可能大
其中,OR 表示按位或运算。
请帮助小兰找到这个最优的解码密钥 。
输入格式
第一行包含一个正整数 (
),表示密钥序列的长度。
第二行包含 个正整数
(
),表示密钥序列中的各个元素。
输出格式
输出一个整数,表示最优的解码密钥 。
样例输入
3
1 1 1
5
1 2 3 4 5
样例输出
1
7
样例编号 | 解释说明 |
---|---|
样例1 | 密钥序列所有元素的按位或为1,要使 |
样例2 | 密钥序列所有元素的按位或为7(1|2|3|4|5=7),要使 |
数据范围
题解
这道题目初看起来比较复杂,但仔细分析后会发现其实有个很巧妙的数学规律。
首先我们来理解题目要求:给定一个数组,要找到一个数 ,使得
与数组所有元素的按位或结果最小,在这个基础上让
尽可能大。
关键观察:设数组所有元素的按位或为 。
对于按位或运算, 的值有一个重要性质:它只能在
的基础上增加新的1位,而不能减少已有的1位。这是因为按位或运算的特点是"有1则1"。
因此:
- 要让
最小,我们不能让
在
为0的位置上贡献任何1,所以最小值就是
本身
- 在满足条件1的前提下,要让
最大,我们可以让
在
为1的所有位置都为1,这样
,而
达到最大值
所以答案就是数组所有元素的按位或结果!
举个例子:对于数组 [1,2,3,4,5],按位或结果是 (二进制111),所以答案就是7。
算法步骤:
- 遍历数组,计算所有元素的按位或
- 直接输出这个结果
时间复杂度:,只需要遍历一次数组 空间复杂度:
,只用了常数额外空间
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
n = int(input())
arr = list(map(int, input().split()))
# 计算所有元素的按位或
res = 0
for val in arr:
res |= val # 累积按位或运算
print(res)
- Cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
// 计算所有元素的按位或
int res = 0;
for (int i = 0; i < n; i++) {
int val;
cin >> val;
res |= val; // 累积按位或运算
}
cout << res << endl;
return 0;
}
- Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 计算所有元素的按位或
int result = 0;
for (int i = 0; i < n; i++) {
int value = sc.nextInt();
result |= value; // 累积按位或运算
}
System.out.println(result);
sc.close();
}
}
02. 智能投资顾问系统
问题描述
小基是一家金融科技公司的数据科学家,她正在开发一个智能投资顾问系统。该系统需要根据客户的财务特征来预测其投资风险偏好(保守型为0,激进型为1)。
小基需要使用机器学习技术来构建这个预测模型。具体要求如下:
-
数据读取
train
:训练数据集,二维列表格式;最后一列为投资风险偏好标签,前
列为客户的数值特征(如年收入、资产总额等),
test
:测试数据集,二维列表格式;仅包含特征数据,与训练集维度相同
-
数据预处理
- 使用标准化处理(
StandardScaler
):在训练集上进行fit
操作,然后分别对train
和test
进行transform
操作
- 使用标准化处理(
-
模型构建
- 你需要使用的随机森林固定参数:
n_estimators = 50
min_samples_split = 2
min_samples_leaf = 1
random_state = 42
- 其他超参数保持默认值;不允许修改
n_estimators
或random_state
- 你需要使用的随机森林固定参数:
-
训练与预测
- 在全部训练样本上进行模型训练(
fit
) - 对测试集进行预测,输出预测的投资风险偏好类别
- 在全部训练样本上进行模型训练(
输入格式
标准输入包含一行 JSON 格式的数据,示例:
{
"train":[[-2.0,0],
[-1.8,0],
[-2.2,0],
[2.0,1],
[2.1,1],
[1.9,1]],
"test":[[-1.0],
[2.0]]
}
- 训练数据量
且两类样本数均
,特征维度
- 所有数值为整数或浮点数,无空行
输出格式
输出一行 JSON 数组格式的预测结果,如:
[0, 1]
数组长度等于测试样本数,格式为合法 JSON,逗号后需要有空格。
样例输入
{"train":[[-2.0,0],[-1.8,0],[-2.2,0],[2.0,1],[2.1,1],[1.9,1]],"test":[[-1.0],[2.0]]}
样例输出
[0, 1]
样例编号 | 解释说明 |
---|---|
样例1 | 根据训练数据,负值特征对应保守型投资者(0),正值特征对应激进型投资者(1)。测试样本[-1.0]预测为0,[2.0]预测为1 |
数据范围
- 训练样本数
- 两类样本数均
- 特征维度
- 所有特征值为数值类型
补充说明
- 所有涉及随机性的操作均需显式设置
random_state=42
- 为确保通过测试用例,仅允许使用
numpy
、pandas
、scikit-learn
库
题解
这道题目考查的是机器学习中的二分类问题,需要使用随机森林算法进行预测。
解题思路:
-
数据解析:从标准输入读取JSON格式的训练和测试数据,将其转换为numpy数组便于处理。
-
特征和标签分离:将训练数据的最后一列作为标签,前面的列作为特征。
-
数据标准化:使用StandardScaler对特征进行标准化处理,这是机器学习中常用的预处理步骤,可以提高模型性能。标准化的核心是让所有特征具有相同的量级。
-
模型训练:使用RandomForestClassifier构建随机森林分类器。随机森林是一种集成学习方法,通过构建多个决策树并投票来提高预测准确性。
-
预测输出:对测试集进行预测,并将结果格式化为JSON数组输出。
关键技术点:
- StandardScaler:先在训练集上fit,再对训练集和测试集分别transform,这样可以避免数据泄露
- RandomForestClassifier:ensemble方法,能够有效处理特征重要性和避免过拟合
- JSON处理:正确解析输入和格式化输出
时间复杂度:训练阶段约为 ,预测阶段约为
,其中N为训练样本数,T为测试样本数。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
import json
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
# 读取JSON数据
raw_data = input()
data = json.loads(raw_data)
# 转换为numpy数组
train_data = np.array(data["train"], dtype=float)
test_data = np.array(data["test"], dtype=float)
# 分离特征和标签
X_tr, y_tr = train_data[:, :-1], train_data[:, -1]
X_te = test_data
# 数据标准化
scaler = StandardScaler()
X_tr = scaler.fit_transform(X_tr)
X_te = scaler.transform(X_te)
# 构建并训练随机森林模型
model = RandomForestClassifier(
n_estimators=50,
min_samples_split=2,
min_samples_leaf=1,
random_state=42
)
model.fit(X_tr, y_tr)
# 预测并输出结果
pred = model.predict(X_te).astype(int).tolist()
print(json.dumps(pred, separators=(", ", ": ")))
- Cpp
// 注意:C++无法直接使用scikit-learn,此处提供伪代码框架
#include <bits/stdc++.h>
#include <nl
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力