【秋招笔试】2025.09.20得物秋招笔试真题改编

✅ 秋招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

得物

题目一:图书整理员的困惑

1️⃣:将序列划分为严格递减且步长为1的段

2️⃣:检查每段翻转后是否能构成连续的升序序列

3️⃣:线性扫描验证,时间复杂度O(n)

难度:中等

这道题目考查对栈操作的理解和序列分析能力。关键在于识别出每次操作产生的都是"严格递减且步长为1"的段,然后验证这些段翻转后是否能构成完整的1到n的升序序列。通过一次线性扫描即可高效解决。

题目二:小基的密文解密

1️⃣:使用动态规划求解最少删除字符数

2️⃣:状态表示目标字符串已匹配的前缀长度

3️⃣:对每个字符决策删除或保留匹配

难度:中等

这道题目结合了字符串处理和动态规划算法。通过维护匹配状态,对每个字符进行删除或匹配的决策,最终找到使目标字符串成为连续子串的最少删除操作数。算法的时间复杂度为O(n×m)。

题目三:小毛的藏品收集

1️⃣:将问题转化为差值数组的子数组和问题

2️⃣:使用前缀和技巧,配合哈希表统计

3️⃣:对每个右端点查找满足条件的左端点个数

难度:中等

这道题目考查前缀和和哈希表的综合应用。通过构建差值数组,将区间金银币差值问题转化为经典的子数组和问题。利用前缀和的性质和哈希表的快速查询,实现O(n)时间复杂度的高效解法。

01. 图书整理员的困惑

问题描述

小兰在图书馆工作,她负责整理返还的图书。图书馆有一个特殊的规定:所有返还的图书都必须按照编号顺序重新上架。每天结束时,小兰会收到 本图书,这些图书从上到下堆叠,编号为

小兰有一个独特的工作习惯:她只会从书堆顶部取连续的若干本图书(设为编号 的连续区间),然后按照从 的逆序将这些图书依次放到整理台上。现在给出图书被放到整理台的顺序,请判断这个顺序是否可能是小兰按照她的工作习惯整理的结果。

输入格式

第一行包含一个正整数 ,表示测试数据的组数。

对于每组测试数据:

  • 第一行包含一个正整数 ,表示图书的数量。

  • 第二行包含 个正整数 ,表示图书被放到整理台的顺序。

输出格式

对于每组测试数据,输出一行。

如果该顺序可能是小兰的整理结果,输出 yes;否则输出 no

样例输入

2
5
1 2 5 4 3
5
1 2 5 3 4

样例输出

yes
no

数据范围

  • ,且 互不相同

样例编号 解释说明
样例1 小兰先取编号1-2的图书逆序放置(得到1,2),再取编号3-5的图书逆序放置(得到5,4,3),最终序列为1,2,5,4,3
样例2 无论如何操作都无法得到序列1,2,5,3,4,因为5,3,4不是严格递减的连续整数序列

题解

这道题的关键在于理解小兰的操作规律。每次她取走的是栈顶的连续区间,然后逆序放置。这意味着最终序列可以被划分为若干个"严格递减且步长为1"的段。

具体来说,如果我们把每个递减段都翻转过来,应该能得到完整的升序序列

解决思路:

  1. 从左到右扫描序列,将相邻差值为 的元素划为同一段
  2. 对于每一段,检查段尾是否等于当前期望的最小值
  3. 如果所有段都满足条件,则该序列合法

举例说明:序列 可以划分为两段:。第一段翻转后为 ,但我们实际需要的是从1开始的连续序列,所以第一段应该对应原序列的 。第二段 翻转后为 ,正好接续前面的序列。

算法的时间复杂度为 ,空间复杂度为

参考代码

Python

import sys
input = lambda: sys.stdin.readline().strip()

def solve():
    # 读入测试用例数量
    t = int(input())
    
    while t > 0:
        t -= 1
        # 读入图书数量
        n = int(input())
        # 读入图书序列
        books = list(map(int, input().split()))
        
        # 检查序列是否合法
        valid = True
        expect = 1  # 下一个应该出现的编号
        i = 0
        
        while i < n and valid:
            j = i
            # 找到当前递减段的结束位置
            while j + 1 < n and books[j + 1] == books[j] - 1:
                j += 1
            
            # 检查段尾是否符合预期
            seg_len = j - i + 1
            if books[j] != expect:
                valid = False
                break
            
            # 更新期望值
            expect += seg_len
            i = j + 1
        
        print("yes" if valid else "no")

if __name__ == "__main__":
    solve()

C++

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t;
    
    while (t--) {
        int n;
        cin >> n;
        vector<int> books(n);
        
        for (int i = 0; i < n; i++) {
            cin >> books[i];
        }
        
        bool valid = true;
        int expect = 1; // 下一个应该出现的编号
        
        for (int i = 0; i < n && valid; ) {
            int j = i;
            // 找到当前递减段的结束位置
            while (j + 1 < n && books[j + 1] == books[j] - 1) {
                j++;
            }
            
            // 检查段尾是否符合预期
            int seg_len = j - i + 1;
            if (books[j] != expect) {
                valid = false;
                break;
            }
            
            // 更新期望值
            expect += seg_len;
            i = j + 1;
        }
        
        cout << (valid ? "yes" : "no") << "\n";
    }
    
    return 0;
}

Java

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int t = Integer.parseInt(br.readLine());
        
        while (t-- > 0) {
            int n = Integer.parseInt(br.readLine());
            String[] input = br.readLine().split(" ");
            int[] books = new int[n];
            
            for (int i = 0; i < n; i++) {
                books[i] = Integer.parseInt(input[i]);
            }
            
            boolean valid = true;
            int expect = 1; // 下一个应该出现的编号
            
            for (int i = 0; i < n && valid; ) {
                int j = i;
                // 找到当前递减段的结束位置
                while (j + 1 < n && books[j + 1] == books[j] - 1) {
                    j++;
                }
                
                // 检查段尾是否符合预期
                int segLen = j - i + 1;
                if (books[j] != expect) {
                    valid = false;
                    break;
                }
                
                // 更新期望值
                expect += segLen;
                i = j + 1;
            }
            
            System.out.println(valid ? "yes" : "no");
        }
    }
}

02. 小基的密文解密

问题描述

小基是一名密码学爱好者,她设计了一种特殊的加密方式。给定一个长度为 的原始消息字符串 ,小基可以对其进行"字符删除"操作:选择 中的任意一个字符并将其删除,然后将剩余的字符重新拼接成新的字符串。

现在小基收到了一个长度为 的目标密文 。她想知道:最少需要对原始消息 执行多少次删除操作,才能使得目标密文 作为处理后字符串的某个连续子串出现?

如果无论进行多少次删除操作都无法达成目标,则输出

输入格式

第一行包含一个正整数 ,表示测试数据的组数。

对于每组测试数据:

  • 第一行包含两个正整数 ,分别表示原始消息 和目标密文 的长度。

  • 第二行包含一个长度为 的字符串 ,表示原始消息。

  • 第三行包含一个长度为 的字符串 ,表示目标密文。

输出格式

对于每组测试数据,输出一行。

如果能够通过删除操作使 成为 的连续子串,输出最少删除次数;否则输出

样例输入

2
8 3
abcdefgh
acg
5 2
aaaaa
ab

样例输出

4
-1

数据范围

  • 所有测试数据的 之和不超过

  • 所有字符均为小写字母

样例编号 解释说明
样例1 从"abcdefgh"中删除4个字符(b,d,e,f,h)得到"acg","acg"本身就是连续子串
样例2 字符串"aaaaa"中不包含字符'b',无论如何删除都无法得到"ab"作为连续子串

题解

这道题的关键在于理解问题的本质:我们要在字符串 中选择一个连续子串,使其等于目标字符串 ,然后删除所有其他字符。

由于目标字符串的长度较小(),我们可以使用动态规划来解决这个问题。

解决思路:

  1. 定义状态: 表示已处理字符串 的前缀,且目标字符串 已匹配前缀长度

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

选择题&nbsp;语言考的都是&nbsp;Golang,代码片段题就不写了Map&nbsp;并发安全问题LLM&nbsp;文本分词用&nbsp;comparable&nbsp;做&nbsp;&amp;gt;&nbsp;操作,问运行结果接口&nbsp;nil&nbsp;值是否安全贪心和&nbsp;DP&nbsp;的共同点6&nbsp;个并发进程,每个所需资源数为&nbsp;4,资源数至少多少才不会发生死锁数组二分查找某个元素,要比较多少次判断类型转换是否合法,string&nbsp;转&nbsp;float&nbsp;非法、bool&nbsp;转&nbsp;int&nbsp;非法修改表中&nbsp;name&nbsp;字段及其注释,正确的&nbsp;SQL&nbsp;语句copy&nbsp;操作数据库事务进程用完时间片进入什么状态DevOps&nbsp;工具,只知道&nbsp;K8s编程题只能用&nbsp;Golang&nbsp;来做T1模拟小A在餐馆打工,他的主要工作就是洗盘子。某一天餐厅有&nbsp;个盘子需要清洗,从上到下编号&nbsp;1-n,小A只会每次拿最上面连续的若干个编号连续的盘子&nbsp;l-r,然后按照&nbsp;r-l&nbsp;的顺序来洗它们。现在,给出一个人洗这个盘子的顺序,请你判断一下是否可能是小A洗盘子的顺序。输入描述第一行一个整数&nbsp;表示数据组数。对于每组数据:第一行一个整数&nbsp;n第二行&nbsp;n&nbsp;个整数&nbsp;ai-an,数字间两两有空格隔开,表示某个人洗盘子的顺序数据范围:1&nbsp;&amp;lt;=&nbsp;n&nbsp;&amp;lt;=&nbsp;1000,1&nbsp;&amp;lt;=&nbsp;T&nbsp;&amp;lt;=&nbsp;50输出描述输出&nbsp;行,每行一个单词,如果可能是小&nbsp;A&nbsp;洗的,则输出&nbsp;yes,否则输出&nbsp;no。样例输入251&nbsp;2&nbsp;5&nbsp;4&nbsp;351&nbsp;2&nbsp;5&nbsp;3&nbsp;4样例输出yesno提示第一组样例:先拿出盘子&nbsp;1,再拿出盘子2&nbsp;,再拿出盘子&nbsp;3~5。&nbsp;第二组样例:不可能是小&nbsp;A&nbsp;洗的。T2不太会贪心做了一遍,91%DP&nbsp;做了一遍,91%想不明白直接交了小钟有一个长度为&nbsp;n&nbsp;的字符串&nbsp;s。小钟可以对&nbsp;执行如下操作:删除&nbsp;的一个字符,并拼接剩下的字符串。例如,字符串&nbsp;s&nbsp;=&nbsp;abcda,小钟可以删除第三个字符,从而得到新的字符串&nbsp;abda。某一天,小钟得到了另一个长度为&nbsp;m&nbsp;的字符串&nbsp;t。现在,小钟想知道最少删除s&nbsp;多少个字符,才能使得&nbsp;t&nbsp;作为&nbsp;s&nbsp;的某个连续子串出现。如果无论如何也不能使得&nbsp;t&nbsp;在&nbsp;s&nbsp;中出现,则输&nbsp;-1出。输入描述输入包括多组测试数据。输入第一行包括一个正整数&nbsp;T(1&nbsp;&amp;lt;=&nbsp;T&nbsp;&amp;lt;=&nbsp;10),表示测试数据的组数。每组测试数据的第一行有两个整数&nbsp;n(1&nbsp;&amp;lt;=&nbsp;n&nbsp;&amp;lt;=&nbsp;100000),m(1&nbsp;&amp;lt;=&nbsp;m&nbsp;&amp;lt;=&nbsp;200),分别表示&nbsp;s&nbsp;和&nbsp;t&nbsp;的长度;第二行有一行字符串&nbsp;s;第三行有一行字符串&nbsp;t。保证每个测试点的所有测试数据的&nbsp;n&nbsp;✖&nbsp;m&nbsp;的和均不超过&nbsp;20000000&nbsp;,保证所有字符均为小写字母。输出描述对于每组测试数据,输出一个正整数表示使得&nbsp;作为&nbsp;的某个连续子串出现的最少删除字符个数。若不存在答案,则输出&nbsp;-1。样例输入28&nbsp;3abcdefghacg5&nbsp;2aaaaaab样例输出4-1提示对于第一组测试数据,删除第&nbsp;2、4、5、6&nbsp;个字符后字符串变为&nbsp;acgh,字符串&nbsp;t&nbsp;=&nbsp;acg&nbsp;作为&nbsp;s&nbsp;的一个连续子串出现。对于第二组测试数据,s&nbsp;中不包含字符&nbsp;b&nbsp;,因而无论如何都不可能使得&nbsp;t&nbsp;作为&nbsp;s&nbsp;的某个连续子串出现。T3前缀和记录&nbsp;ai&nbsp;-&nbsp;bi哈希表记录每个和出现的次数题目描述:&nbsp;小A非常喜欢吃糖,尤其喜欢吃椰子糖与玉米糖。现在小A正在商店中买糖,小A有一个奇怪的癖好,他希望购买的糖满足,椰子糖的数量恰比玉米糖的数量多m个。&nbsp;商店做促销,将椰子糖与玉米糖捆绑销售,货架上一共有n个糖罐排成一排,其中第i个糖罐中包含a_i个椰子糖与b_i个玉米糖,同时要求顾客只有购买连续的一段糖罐才能享受优惠(特别地,只买某一罐也视为连续),那么小A想知道,一共有几种购买方式才能在享受商店优惠的同时,满足他奇怪的癖好。&nbsp;换而言之,求有几对二元组(L,R),(L&amp;lt;=R)满足(a_1+a_2+...+a_R)-(b_1+b_2+...+b_R)=m输入描述:&nbsp;第一行两个正整数n,m&nbsp;第二行n个正整数a_i&nbsp;第三行n个正整数b_i&nbsp;1&nbsp;≤&nbsp;n&nbsp;≤&nbsp;10^5,&nbsp;1&nbsp;≤&nbsp;a_i,&nbsp;b_i,&nbsp;m&nbsp;≤&nbsp;10^9输出描述:&nbsp;输出一个正整数,表示购买的方案数。样例输入1:3&nbsp;21&nbsp;5&nbsp;12&nbsp;2&nbsp;2样例输出1:提示:&nbsp;合法的区间&nbsp;(1,&nbsp;r)&nbsp;有&nbsp;(1,&nbsp;2)&nbsp;与&nbsp;(2,&nbsp;3)输入样例2:5&nbsp;41&nbsp;2&nbsp;3&nbsp;4&nbsp;55&nbsp;4&nbsp;3&nbsp;2&nbsp;1输出样例2:样例解释2:&nbsp;合法的区间&nbsp;(1,&nbsp;r)&nbsp;有&nbsp;(2,&nbsp;5)&nbsp;与&nbsp;(5,&nbsp;5)
投递上海得物信息集团有限公司等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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