【笔试刷题】携程-2026.04.23-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
携程-2026.04.23
这套题前两道都是一眼看上去像构造,真正难点都在“把可行支付范围”或者“回文和的形态”先写成结论。第三题是实现题,但不是简单照着流程抄库,核心在于把元特征选参和逻辑回归训练都稳定落下来;第四题最有区分度,需要先把“能交换”转成值域图上的连通性,再做每个连通块内部的字典序最小重排。
第 1 题:小兰的对称配额表
长度固定为 的回文数组,所有改动都会成对出现;只有在中间留出一个单点时,和的奇偶性才真正自由。把这一点想清楚之后,答案只和
的奇偶有关。
第 2 题:园子的双面额补差付款
如果一共拿了 张钞票,那么总金额一定落在区间
里,而且这个区间里的每个整数都能凑出来。于是问题直接变成:找到第一个能把价格覆盖住的区间,看它的左端点有没有已经越过商品价格。
第 3 题:小柯的历史任务调参器
这题有两层流程。第一层是按元特征做 近邻选出最合适的正则参数;第二层是用这个参数去训练一份标准的二分类逻辑回归。数据范围很小,完全可以自己把训练过程实现出来,不必依赖现成框架。
第 4 题:小哀的倍数交换排序
交换条件看的是当前位置上的两个值能否整除,因此真正决定可达性的不是下标,而是“当前数组里出现过的值”在倍数关系图上的连通性。每个连通块里的值可以任意重排,字典序最小自然就是把块内最小值尽量放到最靠前的位置。
1. 对称配额表
问题描述
小兰在整理一张长度为 的对称配额表,表中的第
个位置记为
。
如果对任意的 都满足:
那么这张表就被称为一张回文表。
现在给定长度 ,需要判断下面这个条件是否成立:
- 对于每一个满足
的正整数
,都能构造出一张长度为
的回文表;
- 表中所有元素都必须是正整数;
- 所有元素之和恰好等于
。
如果上述条件成立,输出 Yes;否则输出 No。
输入格式
第一行输入一个整数 ,表示测试数据组数。
接下来 行,每行输入一个整数
,表示回文表的长度。
输出格式
对于每组数据,输出一行结果:
- 若条件成立,输出
Yes; - 否则输出
No。
样例输入
4
1
2
1000000000
999999999
样例输出
Yes
No
No
Yes
数据范围
| 样例 | 解释说明 |
|---|---|
| 样例1 的第 |
长度为 Yes。 |
| 样例1 的第 |
长度为 |
| 样例1 的第 |
这个 No。 |
| 样例1 的第 |
这个 Yes。 |
题解
关键只在于回文结构会怎样限制总和。
如果长度 是偶数,那么每个位置都会和另一个位置成对出现。设某一对位置上的值都是
,它们对总和的贡献就是
。整张表由若干这样的配对组成,所以总和一定是偶数。
这就带来一个直接结论:
- 当
是偶数时,虽然最小总和仍然是
,但所有奇数总和都不可能出现;
- 题目要求的是“所有
都要能构造出来”,因此偶数长度一定不满足条件。
如果长度 是奇数,情况就不同了。除去左右配对的位置之后,中间还会剩下一个单独的位置。
先把所有位置都填成 ,此时总和正好是
。若想把总和增加到任意一个
,只需要把中间那个位置从
改成:
这样:
- 左右对称关系不会被破坏;
- 所有元素仍然是正整数;
- 总和恰好变成
。
所以奇数长度时,所有 都可以实现。
最终结论是:
为奇数,输出
Yes;为偶数,输出
No。
复杂度分析
每组数据只需要判断一次奇偶性,时间复杂度是 ,总时间复杂度是
,空间复杂度是
。
参考代码(Python)
import sys
def input() -> str:
return sys.stdin.readline().strip()
def solve() -> None:
t = int(input())
out = []
for _ in range(t):
n = int(input())
# 奇数长度有一个独立的中间位置,可以单独补任意增量。
if n & 1:
out.append("Yes")
else:
out.append("No")
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
solve()
2. 双面额补差付款
问题描述
K 小姐手里有两种面额的纸券,并且每种都可以无限使用:
- 一种面额是
;
- 另一种面额是
。
她想支付一件价格为 的商品。收银台不支持找零,所以实际支付金额必须满足:
- 付款金额不能小于
;
- 若付款金额超过
,超出的部分也会被直接扣掉。
请计算最少需要多付多少金额。
如果可以恰好支付,答案就是 。
输入格式
第一行输入一个整数 ,表示测试数据组数。
接下来 行,每行输入两个整数
,分别表示较小的面额和商品价格。
输出格式
对于每组数据,输出一行一个整数,表示最少需要额外多支付的金额。
样例输入
3
3 8
4 6
5 7
样例输出
0
2
3
数据范围
| 样例 | 解释说明 |
|---|---|
| 样例1 的第 |
用两张纸券,金额可以是 |
| 样例1 的第 |
只拿一张不够,拿两张时最少也要付 |
| 样例1 的第 |
拿两张时金额只能落在 |
题解
先把“拿了多少张纸券”固定下来。
假设一共拿了 张纸券,其中有
张面额为
,剩下
张面额为
,那么总金额就是:
因为 可以从
取到
,所以当张数固定为
时,所有可支付金额刚好是一个完整区间:
而且这个区间中的每一个整数都能凑出来。
于是问题变成了:找到最小的 ,使得区间右端点已经不小于商品价格
。也就是说:
满足这个条件的最小张数是:
接下来只要看这个区间的左端点 :
- 如果
,说明价格
落在区间内部,可以恰好支付,答案是
;
- 如果
,说明这个区间整体已经越过了
,最少只能支付左端点
,答案就是
。
因此答案可以直接写成:
其中 。
复杂度分析
每组数据只做常数次计算,时间复杂度是 ,总时间复杂度是
,空间复杂度是
。
参考代码(Python)
import sys
def input() -> str:
return sys.stdin.readline().strip()
def solve() -> None:
t = int(input())
out = []
for _ in range(t):
n, m = map(int, input().split())
# 这是第一个让区间右端点覆盖到 m 的张数。
k = (m + n) // (n + 1)
# 该张数下能达到的最小金额是 k * n。
ans = k * n - m
if ans < 0:
ans = 0
out.append(str(ans))
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
solve()
3. 历史任务调参器
问题描述
A 先生维护了一份历史任务库。每条历史记录都包含两部分信息:
- 一组刻画任务规模的元特征;
- 该任务上效果最好的逻辑回归正则参数
以及对应得分。
现在给定一份新的二分类训练集和测试集,需要按下面的规则,先从历史任务里挑出最合适的 ,再用这个参数训练模型并预测测试标签。
1. 当前任务的元特征
设训练集共有 个样本,每个样本有
个特征,正类样本数为
,负类样本数为
。定义当前任务的元特征向量为:
其中:
2. 用
近邻挑选参数
输入中的 history 里,每一条记录都包含:
meta:一个三维向量;C:该历史任务使用的正则参数;score:该参数在该任务上的表现,分数越大越好。
需要按下面的步骤挑选参数:
- 计算当前任务元特征
到每条历史记录
meta的欧几里得距离; - 取距离最近的
条历史记录;
- 如果距离相同,则按输入中的出现顺序更靠前者优先;
- 统计这
条记录里出现过的所有
C; - 对每个
C,计算它在这条记录中的平均
score;若某条记录没有该C,则忽略; - 取平均分最高的那个
C作为;若仍然并列,取数值更小的那个。
3. 训练逻辑回归并输出预测
选出 后,需要训练一份带
正则的二分类逻辑回归模型,并输出测试集预测标签。
模型的正则强度与 对应,即:
设参数向量为 ,偏置为
,则样本
的线性项为:
概率函数为:
训练目标是标准的二分类逻辑回归负对数似然,加上权重向量的 正则项;偏置项不参与正则化。
训练完成后:
- 若某个测试样本的线性项
,输出标签
1; - 否则输出标签
0。
输入格式
输入只有一行,是一个 JSON 对象:
{
"train_X": [[...], ...],
"train_y": [0, 1, ...],
"test_X": [[...], ...],
"history": [
{"meta": [50, 4, 0.10], "C": 0.1, "score": 0.80},
{"meta": [120, 2, 0.25], "C": 1.0, "score": 0.85}
]
}
其中:
train_X表示训练集特征矩阵;train_y表示训练集标签,元素只会是0或1;test_X表示测试集特征矩阵;history表示历史任务列表。
输出格式
输出一行 JSON:
{"C_star":0.1,"pred":[0,1]}
其中:
C_star表示选出的参数;
pred表示测试集预测结果;pred的长度必须等于测试样本数。
样例输入
{
"train_X": [[0.0,0.0],[0.2,0.4],[0.3,0.5],[0.1,0.2],[1.0,1.1],[1.2,1.3],[1.3,1.4],[1.1,1.0]],
"train_y": [0,0,0,0,1,1,1,1],
"test_X": [[0.15,0.25],[1.15,1.25]],
"history": [
{"meta":[50,2,0.10],"C":0.1,"score":0.82},
{"meta":[48,2,0.20],"C":0.3,"score":0.79},
{"meta":[60,2,0.00],"C":1.0,"score":0.85},
{"meta":[40,4,0.30],"C":3.0,"score":0.80},
{"meta":[55,3,0.18],"C":0.3,"score":0.83},
{"meta":[52,2,0.10],"C":1.0,"score":0.81},
{"meta":[58,2,0.05],"C":10.0,"score":0.78}
]
}
样例输出
{"C_star":0.1,"pred":[0,1]}
数据范围
history至少包含条记录
C只会取自- 所有输入值都是数值型,且没有缺失值
| 样例 | 解释说明 |
|---|---|
| 样例1 | 先按元特征选出最近的 C 的平均 score,得到 0 和 1。 |
题解
这题分成两个阶段,前后顺序不能反。
第一步:先用元特征挑出参数
当前任务的元特征只有三维:
- 训练样本数;
- 特征维度;
- 类别不平衡度。
把这三个量算出来之后,就能和每条历史记录的 做欧
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

查看18道真题和解析