【笔试刷题】蚂蚁-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. 的值尽可能小;

  2. 在所有满足条件 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)。

因此,答案就是 ,即所有数组元素的按位或结果。

算法步骤:

  1. 读入数组的所有元素
  2. 将所有元素依次进行按位或运算
  3. 输出最终结果

时间复杂度:,只需要遍历一遍数组。

空间复杂度:,只需要常数级别的额外空间。

参考代码

  • 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. 小基 会选择原序列中的一个连续区间 ,并计算这个区间的能量总和

  2. 接下来,假设将区间 从序列中移除,剩余的元素按原顺序拼接成一个新序列。

  3. 你的任务是:在这个新序列中,找到一个连续区间 ,使得:

    • 区间长度与被移除的区间相同,即
    • 区间的能量总和
  4. 如果存在多个满足条件的区间,可以输出任意一个;如果不存在这样的区间,则输出

请帮助 小基 完成这个挑战。

输入格式

每个测试文件包含多组测试数据。

第一行包含一个正整数,表示测试数据的组数。

除此之外,保证单个测试文件的所有 之和、所有 之和,以及所有被移除区间长度之和均不超过

对于每组测试数据:

第一行包含两个正整数 ,分别表示能量序列的长度和游戏轮数。

第二行包含 个整数 ,表示初始的能量序列。

此后 行,每行包含两个整数 ,表示 小基 在这一轮选择移除的区间。

输出格式

对于每组测试数据,输出 行,每行对应一轮游戏的答案。

如果无解,输出

否则,输出两个整数 ,表示你选取的区间在新序列中的位置。

样例输入

1
5 2
-1 1 1 -1 1
3 4
1 3

样例输出

2 3
-1
样例 解释说明
样例1 第1轮 原序列为 ,移除区间 (元素为 ,和为 )。新序列为 ,选择区间 (元素为 ,和为 ),满足条件
样例1 第2轮 原序列为 ,移除区间 (元素为 ,和为 )。新序列为 ,只有一个长度为 3 的区间无法选择,因此输出

数据范围

  • 单个测试文件的所有 之和、所有 之和,以及所有被移除区间长度之和均不超过

题解

这道题初看可能觉得复杂,但理解了题意后,可以通过前缀和优化来高效求解。

问题分析

每轮游戏需要:

  1. 计算被移除区间 的和
  2. 在移除该区间后的新序列中,找一个相同长度的区间,使其和

关键观察:新序列由两部分组成——原序列的 部分和 部分拼接而成。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务