菜鸟网络笔试 阿里菜鸟笔试 0822
笔试时间:2025年8月22日
往年笔试合集:
第一题
【背景】菜鸟需要评估不同物流线路在不同季节的运输效率以及不同包裹类型的丢失率,以优化物流运营和服务质量。
【原始表】* route_id(线路ID):线路的唯一标识符,INT(主键)* route_name(线路名称):物流线路的名称,VARCHAR(50)* package_id(包裹ID):包裹的唯一标识符,INT(主键)* route_id(线路ID):关联物流线路表的线路ID,INT* package_type(包裹类型):包裹的类型('大型'或'小型'),VARCHAR(20)* start_time(开始配送时间):包裹开始配送的时间,DATETIME* delivery_time(送达时间):包裹送达的时间,DATETIME* lost_id(丢失ID):丢失记录的唯一标识符,INT(主键)* package_id(包裹ID):关联包裹信息表的包裹ID,INT
【要求】查询出每条物流线路在每个季节的平均送达时间(单位:小时,分钟部分以小数展示,保留两位小数),以及每条物流线路全年包裹的丢失率、每条物流线路运输包裹类型占比。结果按照线路ID升序排列。
【结果字段】查询结果必须包含以下字段:* route_id:线路ID* route_name:线路名称* spring_average_delivery_time:春季(3月、4月、5月)该线路的平均送达时间(round保留2位小数)* summer_average_delivery_time:夏季(6月、7月、8月)该线路的平均送达时间(round保留2位小数)* autumn_average_delivery_time:秋季(9月、10月、11月)该线路的平均送达时间(round保留2位小数)* winter_average_delivery_time:冬季(12月、1月、2月)该线路的平均送达时间(round保留2位小数)* lost_count:该路线全年包裹丢失总数量* lost_rate:该路线全年包裹丢失率(丢失包裹数量/总包裹数量,round保留2位小数)* small_packages:该路线运输“小型”包裹类型占比(“小型”包裹数量/总包裹数量,round保留2位小数)* big_packages:该路线运输“大型”包裹类型占比(“大型”包裹数量/总包裹数量,round保留2位小数)
【计算说明】* 每个包裹的送达时间计算:delivery_time - start_time(结果转换为小时,分钟转换为小数部分)。* 季节划分:春季(3月、4月、5月),夏季(6月、7月、8月),秋季(9月、10月、11月),冬季(12月、1月、2月)。* 占比和丢失率计算需使用 ROUND 函数保留两位小数。lost_package(丢失包裹)表package_info(包裹信息)表logistics_route(物流线路)表
输入描述
输入是一个sql建表函数。
输出描述
包含9列的表格:route_id, route_name, spring_average_delivery_time, summer_average_delivery_time, autumn_average_delivery_time, winter_average_delivery_time, lost_count, lost_rate, small_packages, big_packages
样例输入
下面输入移除了外键约束,方便在oj网站上自测。
-- 删除表(如果存在)
DROP TABLE IF EXISTS logistics_route;
DROP TABLE IF EXISTS package_info;
DROP TABLE IF EXISTS lost_package;
-- 创建表(移除外键约束)
CREATE TABLE logistics_route (
route_id INT PRIMARY KEY,
route_name VARCHAR(50)
);
CREATE TABLE package_info (
package_id INT PRIMARY KEY,
route_id INT,
package_type VARCHAR(20),
start_time DATETIME,
delivery_time DATETIME
-- 移除了外键约束: FOREIGN KEY (route_id) REFERENCES logistics_route(route_id)
);
CREATE TABLE lost_package (
lost_id INT PRIMARY KEY,
package_id INT
-- 移除了外键约束: FOREIGN KEY (package_id) REFERENCES package_info(package_id)
);
-- 插入数据
INSERT INTO logistics_route (route_id, route_name)
VALUES (1, '线路A'), (2, '线路B'), (3, '线路C'), (4, '线路D');
INSERT INTO package_info (package_id, route_id, package_type, start_time, delivery_time)
VALUES
(1, 1, '小型', '2024-01-04 09:10:00', '2024-01-05 10:00:00'),
(2, 2, '大型', '2024-01-09 11:05:00', '2024-01-10 12:00:00'),
(3, 3, '小型', '2024-02-09 11:30:00', '2024-02-10 12:00:00'),
(4, 4, '大型', '2024-03-09 11:15:00', '2024-03-10 12:00:00'),
(5, 1, '小型', '2024-04-09 10:50:00', '2024-04-10 12:00:00'),
(6, 2, '小型', '2024-05-09 11:20:00', '2024-05-10 12:00:00'),
(7, 3, '大型', '2024-06-09 14:30:00', '2024-06-10 15:00:00'),
(8, 4, '小型', '2024-07-09 11:06:00', '2024-07-10 12:00:00');
INSERT INTO lost_package (lost_id, package_id)
VALUES (1, 1), (2, 6);
样例输出
route_id|route_name|spring_average_delivery_time|summer_average_delivery_time|autumn_average_delivery_time|winter_average_delivery_time|lost_count|lost_rate|small_packages|big_packages
1|线路 A|25.17|0.00|0.00|24.83|1|0.50|1.00|0.00
2|线路 B|24.67|0.00|0.00|24.92|1|0.50|0.50|0.50
3|线路 C|0.00|24.50|0.00|24.50|0|0.00|0.50|0.50
4|线路 D|24.75|24.90|0.00|0.00|0|0.00|0.50|0.50
参考题解
SQL:
SELECT lr.route_id, lr.route_name, COALESCE(ROUND(AVG(CASE WHEN MONTH(pi.start_time) BETWEEN 3 AND 5 THEN TIMESTAMPDIFF(MINUTE, pi.start_time, pi.delivery_time)/60.0 END), 2), 0.00) AS spring_average_delivery_time, COALESCE(ROUND(AVG(CASE WHEN MONTH(pi.start_time) BETWEEN 6 AND 8 THEN TIMESTAMPDIFF(MINUTE, pi.start_time, pi.delivery_time)/60.0 END), 2), 0.00) AS summer_average_delivery_time, COALESCE(ROUND(AVG(CASE WHEN MONTH(pi.start_time) BETWEEN 9 AND 11 THEN TIMESTAMPDIFF(MINUTE, pi.start_time, pi.delivery_time)/60.0 END), 2), 0.00) AS autumn_average_delivery_time, COALESCE(ROUND(AVG(CASE WHEN MONTH(pi.start_time) IN (12, 1, 2) THEN TIMESTAMPDIFF(MINUTE, pi.start_time, pi.delivery_time)/60.0 END), 2), 0.00) AS winter_average_delivery_time, COUNT(DISTINCT lp.package_id) AS lost_count, COALESCE(ROUND(COUNT(DISTINCT lp.package_id) / NULLIF(COUNT(DISTINCT pi.package_id), 0), 2), 0.00) AS lost_rate, COALESCE(ROUND(SUM(CASE WHEN pi.package_type = '小型' THEN 1 ELSE 0 END) / NULLIF(COUNT(pi.package_id), 0), 2), 0.00) AS small_packages, COALESCE(ROUND(SUM(CASE WHEN pi.package_type = '大型' THEN 1 ELSE 0 END) / NULLIF(COUNT(pi.package_id), 0), 2), 0.00) AS big_packages FROM logistics_route lr LEFT JOIN package_info pi ON lr.route_id = pi.route_id LEFT JOIN lost_package lp ON pi.package_id = lp.package_id GROUP BY lr.route_id, lr.route_name ORDER BY lr.route_id;
第二题:最大池化操作实现
某医疗诊断公司在进行医疗图像识别的过程中,使用了基于卷积神经网络(CNN)的机器学习模型。其中,卷积层后的最大池化操作是关键步骤之一,它有助于减少模型的计算负担并提取特征的最重要部分。请编程实现CNN中的最大池化操作子功能。最大池化定义:最大池化是一种子采样方法,它在卷积操作后进行,用于减少模型的计算负担并提取特征的最重要部分。最大池化操作的步骤是:在卷积后的特征图中,选取一个固定大小的窗口,以固定的步长滑动窗口,并在每个窗口中选取最大的值作为该窗口的输出。
输入描述
第一行:一个2维的list,表示卷积后的特征图(方阵)
第二行:一个1维的list参数,长度固定为2,表示池化窗口的宽度和高度
输出描述
返回值:一个2维的list,表示经过最大池化操作后的特征图
样例输入
[[1, 2, 1, 2], [3, 4, 3, 4], [1, 2, 1, 2], [3, 4, 3, 4]]
[2, 2]
样例输出
[[4, 4], [4, 4]]
参考题解
问题分析:最大池化操作需要处理一个二维的输入特征图和一个指定池化窗口大小的一维列表。窗口会在特征图上以等于其大小的步长滑动,确保每次移动都能覆盖新的区域而不重叠。关键点:正确计算输出特征图的尺寸,确保窗口在滑动时不会超出输入特征图的边界。输出尺寸由输入尺寸和窗口大小决定,公式为 (输入尺寸 - 窗口大小) / 步长 + 1,其中步长等于窗口大小。算法选择:遍历每个可能的窗口起始位置,提取窗口内的所有元素,计算其最大值,并将这些最大值组合成输出特征图。
C++:
#include <bits/stdc++.h>
using namespace std;
int main() {
string feature_map_str, pool_window_str;
getline(cin, feature_map_str);
getline(cin, pool_window_str);
// 解析输入(假设输入格式正确,比如 [[1,2],[3,4]])
// 使用简单的手工解析
vector<vector<int>> feature_map;
vector<int> pool_window;
// 解析 feature_map
{
vector<int> row;
string num;
for (char c : feature_map_str) {
if (isdigit(c) || c == '-') {
num.push_back(c);
} else {
if (!num.empty()) {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

