【笔试刷题】蚂蚁-2025.10.30-改编真题
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
蚂蚁-2025.10.30
题目一:数字魔法权杖
1️⃣:计算所有数组元素的按位或
2️⃣:按位或结果即为答案
难度:简单
题目二:智能客户分类系统
1️⃣:解析 JSON 格式的输入数据
2️⃣:使用 StandardScaler 对特征进行标准化处理
3️⃣:使用随机森林分类器训练模型并预测
4️⃣:输出 JSON 格式的预测结果
难度:中等
题目三:能量序列挑战
1️⃣:使用前缀和快速计算任意区间和
2️⃣:对于每个询问,分三种情况查找满足条件的区间
3️⃣:完全在左半部分、完全在右半部分、跨越断点
4️⃣:使用枚举或优化数据结构找到最优区间
难度:中等偏难
1. 数字魔法权杖
问题描述
K 小姐是一位魔法师,她最近得到了一根神奇的魔法权杖。这根权杖有 个魔法水晶,每个水晶都蕴含着一个正整数能量值
。
为了激活权杖的最强力量,K 小姐需要选择一个非负整数 作为催化剂,使得
与所有水晶能量值进行魔法融合后的总能量尽可能小。魔法融合的规则是:对所有能量值进行按位或运算。
具体来说,K 小姐需要选择一个非负整数 ,满足以下两个条件(按优先级从高到低排序):
-
的值尽可能小;
-
在所有满足条件 1 的
中,选择值最大的一个。
其中, 表示按位或运算。
请帮助 K 小姐找到这个最优的催化剂值 。
输入格式
第一行包含一个正整数
,表示魔法水晶的数量。
第二行包含 个正整数
,表示每个水晶的能量值。
输出格式
输出一个整数,表示最优的催化剂值 。
样例输入
3
1 1 1
5
1 2 3 4 5
样例输出
1
7
| 样例 | 解释说明 |
|---|---|
| 样例1 | 所有水晶能量值都是 1,按位或结果为 1。选择 |
| 样例2 | 水晶能量值为 1, 2, 3, 4, 5,按位或结果为 7(二进制 111)。选择 |
数据范围
题解
这道题乍一看可能有点复杂,但其实找到规律后非常简单。
首先理解按位或运算的性质:对于任意两个数 和
,
的结果至少不小于
和
中的任何一个。并且,如果某一位在
或
中为 1,那么结果中这一位也必定为 1。
设 ,即所有水晶能量值的按位或结果。关键观察是:对于任意非负整数
,都有
。
为什么呢?因为 已经包含了所有
中出现过的 1 位。如果
在某些位上有 1 而
没有,那么
会变大;如果
只在
已经是 1 的位上有 1,那么
。
要让 尽可能小,最小值只能是
本身。要达到这个最小值,
只能在
为 1 的位上选择性地设置为 1,而不能在
为 0 的位上设置 1。
在满足 的所有
中,最大的
就是
本身(所有
为 1 的位在
中也都设为 1)。
因此,答案就是 ,即所有数组元素的按位或结果。
算法步骤:
- 读入数组的所有元素
- 将所有元素依次进行按位或运算
- 输出最终结果
时间复杂度:,只需要遍历一遍数组。
空间复杂度:,只需要常数级别的额外空间。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
# 读入水晶数量
n = int(input())
# 读入所有能量值
vals = list(map(int, input().split()))
# 计算所有能量值的按位或
res = 0
for v in vals:
res |= v # 按位或运算累积
# 输出结果
print(res)
- Cpp
#include <iostream>
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.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读入水晶数量
int n = sc.nextInt();
// 累积按位或结果
int res = 0;
for (int i = 0; i < n; i++) {
int val = sc.nextInt();
res |= val; // 按位或运算
}
// 输出答案
System.out.println(res);
sc.close();
}
}
2. 智能客户分类系统
问题描述
A 先生在一家金融科技公司工作,他负责开发一个智能客户分类系统。系统需要根据客户的历史行为特征,将客户分为两类:高价值客户(类别 1)和普通客户(类别 0)。
为了实现这个目标,A 先生决定使用随机森林算法来构建分类模型。现在,他需要你帮忙实现一个标准的随机森林二分类器,并对新客户进行分类预测。
具体要求如下:
1. 数据读取
:二维列表,表示训练数据。最后一列为客户类别标签
,前
列为客户的特征数据(
)
:二维列表,表示测试数据。仅包含客户特征,与训练集特征维度相同
2. 数据预处理
- 使用
进行标准化:在训练集上
,然后将
和
分别
3. 模型配置
使用随机森林分类器,固定参数如下:
- 其余超参数保持默认值;不得改动
或
4. 训练与预测
- 在全部训练样本上进行
训练
- 对
数据进行预测,输出预测的客户类别
注意:只能使用 、
、
这三个库。
输入格式
标准输入仅一行,为 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 |
数据范围
- 训练样本数
- 每类样本数
- 特征维度
- 测试样本数
题解
这道题考查的是如何使用 scikit-learn 库来实现一个标准的随机森林二分类器。虽然看起来像是机器学习题目,但实际上主要是考察对标准库的熟练使用。
核心思路很直接:按照题目要求的步骤,依次完成数据解析、标准化、模型训练和预测即可。
第一步:数据解析
输入是一个 JSON 字符串,需要用 json.loads() 解析成字典。训练数据的最后一列是标签,前面的列是特征。我们需要把特征和标签分离开。
第二步:数据标准化
使用 StandardScaler 对特征进行标准化处理。标准化的目的是让不同量纲的特征具有可比性。需要注意的是,标准化器要在训练集上 fit,然后用同一个标准化器分别 transform 训练集和测试集。
第三步:模型训练
使用 RandomForestClassifier 创建随机森林分类器,按照题目要求设置参数。随机森林是一种集成学习方法,通过构建多棵决策树并投票得到最终预测结果,具有很好的泛化能力。
第四步:预测输出
用训练好的模型对测试数据进行预测,得到的结果是 numpy 数组,需要转换成 Python 列表,再用 json.dumps() 转换成 JSON 格式输出。注意 JSON 格式要求逗号后有空格。
整个过程的时间复杂度主要取决于随机森林的训练过程,对于题目给定的数据规模(样本数不会太大),完全可以在合理时间内完成。
参考代码
- Python
import sys
import json
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
# 读取输入的JSON数据
input_line = sys.stdin.readline().strip()
data = json.loads(input_line)
# 解析训练数据和测试数据
train_data = np.array(data['train'])
test_data = np.array(data['test'])
# 分离特征和标签
# 训练数据:特征是除最后一列外的所有列,标签是最后一列
X_trn = train_data[:, :-1]
y_trn = train_data[:, -1].astype(int)
# 数据标准化
scaler = StandardScaler()
scaler.fit(X_trn) # 在训练集上拟合
X_trn = scaler.transform(X_trn) # 标准化训练集
X_tst = scaler.transform(test_data) # 标准化测试集
# 创建随机森林分类器,使用题目指定的参数
rf = RandomForestClassifier(
n_estimators=50,
min_samples_split=2,
min_samples_leaf=1,
random_state=42
)
# 在训练集上训练模型
rf.fit(X_trn, y_trn)
# 对测试集进行预测
preds = rf.predict(X_tst)
# 将预测结果转换为列表并输出为JSON格式
result = preds.tolist()
print(json.dumps(result))
3. 能量序列挑战
问题描述
小基 是一位能量研究专家,她发现了一种特殊的能量序列。这个序列由 个能量单元组成,记为
,其中每个能量单元
的值为
或
。
为了研究能量的平衡性,小基 设计了一个挑战游戏,游戏共进行 轮,每轮游戏相互独立(即每轮都基于原始序列进行)。
每轮游戏的规则如下:
-
小基 会选择原序列中的一个连续区间
,并计算这个区间的能量总和
。
-
接下来,假设将区间
从序列中移除,剩余的元素按原顺序拼接成一个新序列。
-
你的任务是:在这个新序列中,找到一个连续区间
,使得:
- 区间长度与被移除的区间相同,即
- 区间的能量总和
- 区间长度与被移除的区间相同,即
-
如果存在多个满足条件的区间,可以输出任意一个;如果不存在这样的区间,则输出
。
请帮助 小基 完成这个挑战。
输入格式
每个测试文件包含多组测试数据。
第一行包含一个正整数,表示测试数据的组数。
除此之外,保证单个测试文件的所有 之和、所有
之和,以及所有被移除区间长度之和均不超过
。
对于每组测试数据:
第一行包含两个正整数 和
,分别表示能量序列的长度和游戏轮数。
第二行包含 个整数
,表示初始的能量序列。
此后 行,每行包含两个整数
和
,表示 小基 在这一轮选择移除的区间。
输出格式
对于每组测试数据,输出 行,每行对应一轮游戏的答案。
如果无解,输出 。
否则,输出两个整数 和
,表示你选取的区间在新序列中的位置。
样例输入
1
5 2
-1 1 1 -1 1
3 4
1 3
样例输出
2 3
-1
| 样例 | 解释说明 |
|---|---|
| 样例1 第1轮 | 原序列为 |
| 样例1 第2轮 | 原序列为 |
数据范围
- 单个测试文件的所有
之和、所有
之和,以及所有被移除区间长度之和均不超过
题解
这道题初看可能觉得复杂,但理解了题意后,可以通过前缀和优化来高效求解。
问题分析
每轮游戏需要:
- 计算被移除区间
的和
- 在移除该区间后的新序列中,找一个相同长度的区间,使其和
关键观察:新序列由两部分组成——原序列的 部分和
部分拼接而成。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
查看13道真题和解析