【秋招笔试】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 ,可以用两块纯净水晶,总能量

题解

这道题的核心是要理解纯净水晶和复合水晶的性质。纯净水晶的能量值为 ,复合水晶的能量值为合数(大于 且不是质数的数)。

关键观察:

  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. 小毛的餐厅推荐系统

问题描述

小毛经营着一家美食评价网站,他需要开发一个智能推荐系统来分析顾客对餐厅的评价。系统需要根据顾客的文本评价自动判断是好评()还是差评()。

为了确保系统的准确性,小毛决定使用机器学习方法,具体流程如下:

  1. 数据预处理:将评价文本统一转换为小写,去除首尾空白字符,并将多个连续空格合并为单个空格
  2. 特征提取:使用 元组的词袋模型(),设置 ,然后应用 变换
  3. 模型训练:使用逻辑回归(),参数设置为:
  4. 预测:如果正类概率 ,则判断为好评(),否则为差评(

输入格式

输入为一个 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)

题解

这道题考查的是文本分类的经典流程,需要用到机器学习中的自然语言处理技术。

核心步骤分析:

  1. 文本预处理:标准化文本格式,确保数据一致性。使用 lower() 转小写,strip() 去首尾空白,split() 然后重新 join() 来合并多余空格。

  2. 特征工程:使用词袋模型提取特征。CountVectorizerngram_range=(1,2) 表示同时考虑单词和双词组合,min_df=1 表示词频阈值为1。接着用 TfidfTransformer 进行 TF-IDF 变换,这样可以降低高频词的权重,提升模型效果。

  3. 模型训练:逻辑回归是文本分类的经典算法,参数设置都按题目要求固定,确保可重现性。

  4. 预测过程:使用 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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

A_SOUL_Off...:疑似加班加出幻觉了
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

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