【秋招笔试】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:,不是和谐宝石

数据范围

题解

这道题的关键是理解和谐宝石的判定条件。对于一个三位数 ,我们需要:

  1. 将数字分解为百位、十位、个位
  2. 计算各位数字的立方和
  3. 判断立方和是否等于原数

具体做法是:

  • 百位数字:
  • 十位数字:
  • 个位数字:

然后计算 比较即可。

时间复杂度为 ,只需要进行常数次的算术运算。

参考代码

  • 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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
牛6666666__:select f.farm_name as farm_name, c.crop_name, c.crop_type, round(avg(health_index), 2) as avg_health_index, round(sum(yield_kg_per_hectare),0) as avg_yield_kg_per_hectare, datediff(max(measurement_date), min(planting_date)) as growth_days from crop_data cd inner join farms f on cd.farm_id = f.farm_id inner join crops c on cd.crop_id = c.crop_id where cd.measurement_date between '2024-03-01' and '2024-06-30' group by cd.crop_id, cd.farm_id,f.farm_name having count(cd.data_id) >= 3 order by avg_health_index desc, avg_yield_kg_per_hectare desc,farm_name
投递恒生电子股份有限公司等公司10个岗位
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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