【秋招笔试】2025.09.18携程秋招笔试改编真题
✅ 秋招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
携程
题目一:小兰的魔法宝石鉴定
1️⃣:分解三位数的各位数字
2️⃣:计算各位数字的立方和
3️⃣:判断立方和是否等于原数
难度:简单
这道题目考查基础的数学运算和数字处理。通过简单的除法和取模运算分解数字各位,再进行立方和计算比较即可。算法复杂度为 O(1),适合作为编程基础题目。
题目二:小基的密码解译系统
1️⃣:按规则进行字母转换(小写前驱,大写后继)
2️⃣:从右到左进行配对消除(同字母异大小写)
3️⃣:使用栈数据结构优化第二步处理
难度:中等
这道题目结合了字符串处理和栈的应用。需要理解字母表的循环特性,以及从右到左的处理逻辑。通过栈的数据结构可以高效地实现配对消除操作,时间复杂度为 O(n)。
题目三:小毛的信号增强实验
1️⃣:理解异或操作的性质和可能的最终状态
2️⃣:按二进制位分别统计和计算
3️⃣:枚举所有候选异或值求最优解
难度:中等偏难
这道题目需要深入理解位运算的性质,关键是发现经过任意次操作后,最终状态只可能是与原数组中某个元素(或0)异或的结果。通过按位统计的方法可以高效计算每种情况的结果。
题目四:小柯的排序优化挑战
1️⃣:理解区间反转对逆序对的影响
2️⃣:使用树状数组高效计算逆序对
3️⃣:枚举所有可能区间并增量维护最优解
难度:中等偏难
这道题目综合考查了逆序对计算、树状数组应用和区间操作分析。需要理解反转操作对逆序对的具体影响,并通过高效的数据结构来优化计算过程。算法设计考验对问题本质的深入理解。
01. 小兰的魔法宝石鉴定
问题描述
小兰是一位经验丰富的魔法宝石鉴定师。在她的魔法工作室中,每一颗宝石都刻有一个三位数的魔法编码 。
根据古老的魔法传说,当一颗宝石的编码满足特殊条件时,它就是传说中的「和谐宝石」:设编码的百位数字为 ,十位数字为
,个位数字为
,如果
,则这颗宝石具有特殊的魔法力量。
现在小兰收到了一颗新的宝石,编码为 ,请帮助她判断这是否是一颗和谐宝石。如果是,输出
YES;否则输出 NO。
输入格式
输入一个三位正整数 (
),表示宝石上的魔法编码。
输出格式
输出一行,如果是和谐宝石则输出 YES,否则输出 NO。
样例输入
153
100
样例输出
YES
NO
| 样例 | 解释说明 |
|---|---|
| 样例1 | 编码153: |
| 样例2 | 编码100: |
数据范围
题解
这道题的关键是理解和谐宝石的判定条件。对于一个三位数 ,我们需要:
- 将数字分解为百位、十位、个位
- 计算各位数字的立方和
- 判断立方和是否等于原数
具体做法是:
- 百位数字:
- 十位数字:
- 个位数字:
然后计算 与
比较即可。
时间复杂度为 ,只需要进行常数次的算术运算。
参考代码
- Python
import sys
input = lambda:sys.stdin.readline().strip()
# 读取宝石编码
num = int(input())
# 分解各位数字
hun = num // 100 # 百位数字
ten = (num // 10) % 10 # 十位数字
one = num % 10 # 个位数字
# 计算立方和
cube_sum = hun * hun * hun + ten * ten * ten + one * one * one
# 判断是否为和谐宝石
if cube_sum == num:
print("YES")
else:
print("NO")
- Cpp
#include <iostream>
using namespace std;
int main() {
int gem;
cin >> gem;
// 提取各位数字
int h = gem / 100; // 百位
int t = gem / 10 % 10; // 十位
int o = gem % 10; // 个位
// 计算立方和
int sum = h * h * h + t * t * t + o * o * o;
// 输出判断结果
cout << (sum == gem ? "YES" : "NO") << endl;
return 0;
}
- Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取宝石编码
int gemCode = scanner.nextInt();
// 分解数字
int hundred = gemCode / 100; // 百位
int ten = (gemCode / 10) % 10; // 十位
int unit = gemCode % 10; // 个位
// 计算立方和
int cubeSum = hundred * hundred * hundred +
ten * ten * ten +
unit * unit * unit;
// 判断并输出结果
if (cubeSum == gemCode) {
System.out.println("YES");
} else {
System.out.println("NO");
}
scanner.close();
}
}
02. 小基的密码解译系统
问题描述
知名密码学家小基设计了一套独特的密码解译系统。她收到了一串长度为 的加密文本
,该文本仅由大小写英文字母构成。
为了解译这串密码,小基需要按照以下两个步骤进行操作:
第一步:字母转换
从左到右依次处理文本中的每个字符:
-
如果是小写字母,将其替换为字母表中的前一个小写字母。特别地,字母
'a'的前驱是'z'。 -
如果是大写字母,将其替换为字母表中的后一个大写字母。特别地,字母
'Z'的后继是'A'。
第二步:配对消除
在完成第一步后,从右到左依次检查每个位置的字符:
-
如果当前字符不是文本的最后一个字符,且它与右侧相邻字符是同一字母的大小写形式(如
'a'和'A'),则删除当前字符。 -
每次删除后,剩余字符按原顺序重新排列,继续进行检查,直到处理完所有位置。
请输出小基完成解译后得到的最终文本。
输入格式
第一行输入一个整数 (
),表示加密文本的长度。
第二行输入一个长度为 的字符串
,由大小写英文字母构成。
输出格式
输出一行,表示解译后的最终文本。
样例输入
2
bZ
3
bzb
样例输出
A
aa
| 样例 | 解释说明 |
|---|---|
| 样例1 | 初始:"bZ" → 转换后:"aA" → 从右到左:'a'保留,'A'与右邻'a'配对消除 → 结果:"A" |
| 样例2 | 初始:"bzb" → 转换后:"aAa" → 从右到左:'a'保留,'A'与右邻'a'配对消除,左侧'a'保留 → 结果:"aa" |
数据范围
题解
这道题需要分两步处理,每一步都有明确的逻辑:
第一步:字母转换 对于每个字符,根据其大小写进行相应转换。可以用简单的算术运算实现:
- 小写字母:
(ch - 'a' + 25) % 26 + 'a' - 大写字母:
(ch - 'A' + 1) % 26 + 'A'
第二步:配对消除 这一步的关键是从右到左处理。我们可以用栈的思想:
- 从右到左遍历转换后的字符串
- 维护一个结果栈,栈顶元素就是当前字符的右邻字符
- 如果当前字符与栈顶字符是同字母异大小写,则不将当前字符入栈(相当于删除)
- 否则将当前字符入栈
- 最后将栈中元素逆序输出
判断同字母异大小写的方法:tolower(a) == tolower(b) && islower(a) != islower(b)
时间复杂度 ,空间复杂度
。
参考代码
- Python
import sys
input = lambda:sys.stdin.readline().strip()
n = int(input())
text = input()
# 第一步:字母转换
trans = []
for ch in text:
if ch.islower():
# 小写字母前驱
new_ch = chr((ord(ch) - ord('a') + 25) % 26 + ord('a'))
else:
# 大写字母后继
new_ch = chr((ord(ch) - ord('A') + 1) % 26 + ord('A'))
trans.append(new_ch)
# 第二步:配对消除(用栈实现)
stack = []
for i in range(n - 1, -1, -1): # 从右到左
curr = trans[i]
# 检查是否与栈顶配对消除
if stack and curr.lower() == stack[-1].lower() and curr.islower() != stack[-1].islower():
continue # 不入栈,相当于删除
stack.append(curr)
# 输出结果(栈是逆序的,需要反转)
print(''.join(reversed(stack)))
- Cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
string s;
cin >> s;
// 第一步:字母转换
for (char &ch : s) {
if (islower(ch)) {
// 小写字母前驱
ch = (ch == 'a') ? 'z' : ch - 1;
} else {
// 大写字母后继
ch = (ch == 'Z') ? 'A' : ch + 1;
}
}
// 第二步:从右到左配对消除
vector<char> res;
for (int i = n - 1; i >= 0; --i) {
char curr = s[i];
bool shouldDel = false;
// 检查是否与右邻字符配对
if (!res.empty()) {
char right = res.back();
if (tolower(curr) == tolower(right) &&
islower(curr) != islower(right)) {
shouldDel = true;
}
}
if (!shouldDel) {
res.push_back(curr);
}
}
// 逆序输出
reverse(res.begin(), res.end());
for (char ch : res) {
cout << ch;
}
cout << endl;
return 0;
}
- Java
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String text = scanner.next();
// 第一步:字母转换
StringBuilder transformed = new StringBuilder();
for (char ch : text.toCharArray()) {
if (Character.isLowerCase(ch)) {
// 小写字母前驱
char newChar = (ch == 'a') ? 'z' : (char)(ch - 1);
transformed.append(newChar);
} else {
// 大写字母后继
char newChar = (ch == 'Z') ? 'A' : (char)(ch + 1);
transformed.append(newChar);
}
}
// 第二步:从右到左配对消除
Stack<Character> stack = new Stack<>();
for (int i = n - 1; i >= 0; i--) {
char current = transformed.charAt(i);
// 检查是否与栈顶配对消除
if (!stack.isEmpty()) {
char top = stack.peek();
if (Character.toLowerCase(current) == Character.toLowerCase(top) &&
Character.isLowerCase(current) != Character.isLowerCase(top)) {
continue; // 跳过当前字符(删除)
}
}
stack.push(current);
}
// 输出结果
StringBuilder result = new StringBuilder();
while (!stack.isEmpty()) {
result.append(stack.pop());
}
System.out.println(result.toString());
scanner.close();
}
}
03. 小毛的信号增强实验
问题描述
小毛是一位电子信号处理专家,他正在研究一种新型的信号增强技术。在他的实验室中,有一台特殊的信号处理器,它可以对一组数字信号进行特殊的增强处理。
给定一个包含 个非负整数的信号序列
,信号处理器允许进行以下操作任意次(也可以不进行任何操作):
- 选择当前序列中的任意一个信号值 ,然后对序列
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力
