【笔试刷题】虾皮-2026.03.23-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

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

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

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

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

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

虾皮-2026.03.23

虾皮-2026.03.23

这套题的梯度很清楚。第 1 题是一次扫描的经典贪心,重点在于把“历史最低买价”维护对;第 2 题是整套里最重的一题,要把表达式按优先级解析出来,再做集合拼接与并集;第 3 题则很轻,抓住“空格数 + 1”这个观察就能秒掉。

题目一:报价窗口里的最大收益

每天都尝试把当天当成卖出日,同时维护之前最便宜的买入价,就能在线性时间里拿到最优答案。

难度:Low

题目二:标签模板的有序展开

关键不是暴力拼字符串,而是先把表达式语法拆成“并集、拼接、最小因子”三层,再用递归下降稳定地展开集合。

难度:High

题目三:消息列表里的最长一句

题目保证每个句子格式规整,所以一句话的单词数直接等于空格数加一,逐句取最大值即可。

难度:Low

1. 报价窗口里的最大收益

问题描述

小基 在整理一款商品最近 天的报价记录。第 天的价格记为

她只允许做一笔交易:

  • 选择某一天买入;
  • 再选择未来某一天卖出;
  • 买入日和卖出日必须不同。

请你计算这笔交易最多能获得多少收益。如果始终无法赚到钱,就输出 0

输入格式

第一行输入一个整数 ,表示报价记录的天数。

第二行输入 个整数 ,表示每天的报价。

输出格式

输出一个整数,表示最多能够获得的收益。

样例输入

6
7 1 5 3 6 4

样例输出

5

数据范围

样例 解释说明
样例1 在价格为 1 的那天买入,在价格为 6 的那天卖出,收益是 5
补充示例 若报价是 7 6 4 3 1,价格一直下降,无论怎么选都不能盈利,所以答案是 0

题解

这题只允许买一次、卖一次,所以真正要找的是:

某一天卖出时,前面有没有更便宜的买入机会。

于是可以从左到右扫一遍数组,同时维护两个量:

  • low:当前为止见过的最低价格,也就是最合适的买入价。
  • ans:当前为止能够得到的最大收益。

扫描到当天价格 时,只有两种情况:

  • 如果 low 还小,那它更适合作为新的买入价,直接更新 low
  • 否则就尝试把今天当成卖出日,候选收益是 ,再拿它更新答案。

为什么这样就够了?

  • 对于任意一个卖出日,最优买入日一定是它之前价格最低的那一天。
  • low 恰好一直维护着这个信息。
  • 所以每一天都只需要和历史最低价配对一次,不用回头重试。

整趟扫描只会遍历数组一次,时间复杂度是 ,额外空间复杂度是

参考代码

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


def solve():
    n = int(input())
    arr = list(map(int, input().split()))

    # low 维护历史最低买入价,ans 维护当前最大收益。
    low = arr[0]
    ans = 0

    for i in range(1, n):
        x = arr[i]
        # 如果今天更便宜,就把它记成新的买入候选日。
        if x < low:
            low = x
        else:
            # 否则尝试把今天当卖出日,刷新最大收益。
            ans = max(ans, x - low)

    print(ans)


if __name__ == "__main__":
    solve()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    // low 表示扫到当前位置前的最低价格。
    int low = arr[0];
    int ans = 0;

    for (int i = 1; i < n; i++) {
        int x = arr[i];
        // 今天价格更低时,直接刷新买入价。
        if (x < low) {
            low = x;
        } else {
            // 否则把今天当卖出日,尝试更新答案。
            ans = max(ans, x - low);
        }
    }

    cout << ans << '\n';
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);
        int n = fs.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = fs.nextInt();
        }

        // low 记录历史最低价格,ans 记录最大收益。
        int low = arr[0];
        int ans = 0;

        for (int i = 1; i < n; i++) {
            int x = arr[i];
            // 更低的价格更适合作为新的买入点。
            if (x < low) {
                low = x;
            } else {
                // 今天卖出的收益由“当前价 - 历史最低价”得到。
                ans = Math.max(ans, x - low);
            }
        }

        System.out.println(ans);
    }

    static class FastScanner {
        private final InputStream in;
        private final byte[] buf = new byte[1 << 16];
        private int len = 0;
        private int ptr = 0;

        FastScanner(InputStream is) {
            in = is;
        }

        private int read() throws IOException {
            if (ptr >= len) {
                len = in.read(buf);
                ptr = 0;
                if (len <= 0) {
                    return -1;
                }
            }
            return buf[ptr++];
        }

        int nextInt() throws IOException {
            int c;
            while ((c = read()) <= ' ') {
                if (c == -1) {
                    return -1;
                }
            }
            int sign = 1;
            if (c == '-') {
                sign = -1;
                c = read();
            }
            int val = 0;
            while (c > ' ') {
                val = val * 10 + c - '0';
                c = read();
            }
            return val * sign;
        }
    }
}

2. 标签模板的有序展开

问题描述

小兰在维护一套标签模板语言。一个表达式 expression 只会由小写字母、花括号和逗号组成,并且满足下面的规则:

  • 如果给出一个单词,那么它表示一个只包含这个单词的集合。
  • 如果给出两个表达式 ,并把它们直接写在一起,那么结果表示把 中的每个单词和 中的每个单词依次拼接得到的新集合。
  • 如果给出一个形如 {e_1,e_2,\ldots} 的表达式,那么它表示这些表达式结果的并集。

现在给出一个合法表达式 expression。请你求出它最终能够生成的所有不同单词,并按字典序输出。

输入格式

输入一行字符串 expression,表示待展开的模板表达式。

输出格式

第一行输出一个整数 ,表示去重后得到的单词数量。

接下来输出 行,每行一个单词,要求按字典序从小到大排列。

样例输入

{a,b}{c,{d,e}}

样例输出

6
ac
ad
ae
bc
bd
be

数据范围

  • expression 只包含 {}, 和小写英文字母
  • 题目保证输入表达式合法
样例 解释说明
样例1 {a,b} 可以生成 ab{c,{d,e}} 可以生成 cde,两边直接相邻表示拼接,所以最后得到 acadaebcbdbe
补充示例 若输入为 {{a,z},a{b,c},{ab,z}},去重并排序后得到 aabacz,因此输出先写 4,再按顺序逐行输出这 4 个单词。

题解

这题的难点不在集合操作本身,而在于先把表达式按正确的优先级解析出来。

可以把语法拆成 3 层:

  • expr:处理并集,也就是逗号分隔的部分。
  • term:处理连续拼接。
  • factor:处理一个最小单元,要么是一段连续字母,要么是一对花括号包起来的子表达式。

优先级关系是:

  • 花括号里的内容先算;
  • 直接相邻的拼接高于逗号并集;
  • 逗号最后再做并集。

于是可以直接写一个递归下降解析器。

1. factor

如果当前位置是 {,那就递归解析里面的完整表达式,直到读到匹配的 }

如果当前位置是字母,就把这一段连续的小写字母整体读出来,作为只含一个单词的集合返回。

2. term

term 负责连续拼接。假设当前已经有一个集合 A,后面又解析出了一个集合 B,那么新的结果就是它们的笛卡尔积拼接:

为了让第一个因子也能统一处理,可以把初始值设成只含空串的集合 {""}

3. expr

expr 负责并集。先解析一个 term,之后只要遇到逗号,就继续解析下一个 term,再把两个集合合并起来即可。

因为题目本身要求去重,集合结构天然就能帮忙消掉重复答案。最后再把结果按字典序输

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

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

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

全部评论

相关推荐

虽然&nbsp;0&nbsp;面试,没有&nbsp;offer&nbsp;消息,没有&nbsp;HR&nbsp;来电,甚至打开招聘软件依旧是一片安静,但我依然想认认真真地夸夸今天的自己。不是只有拿到面试、收到&nbsp;offer&nbsp;才叫努力,不是只有一路顺风、步步上岸才值得被肯定。在这个人人都晒进度、晒&nbsp;offer、晒上岸喜讯的春招里,愿意安静坚持、不放弃、不摆烂、认真过好每一天的你,已经超级棒了。今天的我,值得被夸,因为我按时起床了。没有赖床到中午,没有在焦虑里昏昏沉沉一整天,哪怕心里空空的、慌慌的,还是掀开被子,认真洗漱,给自己一个清醒的开始。对很多人来说,起床只是一件小事,可对正在求职、天天等待、反复内耗的我们来说,能从床上起来,就已经是战胜了情绪。今天的我,值得被夸,因为我认真投出了每一份简历。没有海投乱投敷衍自己,没有随便点一下投递就草草了事。我仔细看了岗位&nbsp;JD,确认了工作内容,核对了投递要求,哪怕只是一份普通的实习、一个基础的岗位,我也拿出了最真诚的态度。我知道,简历可能石沉大海,可能已读不回,可能连初筛都过不去,但我依然认认真真地完成了每一步。这种不敷衍、不放弃的坚持,比一时的结果更珍贵。今天的我,值得被夸,因为我静下心改完了简历。也许只是微调一句话,也许只是补充一段经历,也许只是把格式排得更整齐一点,但我没有拖延,没有逃避。我知道,一份好简历,是我们敲开机会的第一扇门。我一点点打磨,一点点完善,不着急、不焦躁,把能做的小事做到极致。如果你也和我一样,对着简历反复修改却总觉得不够好,不知道怎么匹配岗位、怎么突出亮点、怎么让&nbsp;HR&nbsp;一眼看到你的优势,真的可以试试泡泡小程序&nbsp;AiCV&nbsp;简历王。它不用你花大量时间研究技巧,就能帮你精准匹配&nbsp;JD、优化经历、梳理亮点,把普通的经历写出价值,把杂乱的排版变得专业。在我们连情绪都快撑不住的时候,有一个靠谱的工具帮我们减负,真的会轻松很多。我们已经够努力了,不必再在简历上独自死磕。今天的我,值得被夸,因为我没有内耗到崩溃。看到别人晒面试、晒&nbsp;offer,我也会羡慕,也会偷偷难过,也会忍不住问:为什么别人那么顺利,我却连一个面试都没有?是不是我不够好?是不是我再努力也没用?但我没有让情绪把自己吞没。我允许自己难过几分钟、叹几口气,然后告诉自己:不是我不够好,只是时机还没到,只是匹配的机会还在路上。我没有刷一晚上焦虑帖,没有整夜失眠自我否定,没有把自己困在&nbsp;“我不行”&nbsp;的怪圈里。能和情绪和平相处,能在低谷里拉住自己,你真的很强大。今天的我,值得被夸,因为我认真吃好了一日三餐。没有因为焦虑不吃早饭,没有因为等待随便啃面包,没有在低落里饿肚子。我好好吃饭,好好喝水,好好照顾自己的身体。求职这条路很难,可身体是我们最踏实的底气。哪怕全世界暂时还没看到我,我也要好好照顾自己。好好吃饭,好好生活,本身就是一种了不起的韧性。今天的我,值得被夸,因为我没有摆烂,没有躺平。我没有关掉招聘软件,没有删除求职群,没有对未来说&nbsp;“算了吧”。哪怕今天&nbsp;0&nbsp;面试、0&nbsp;进展、0&nbsp;消息,我依然保持着节奏,该学习学习,该复盘复盘,该准备面试准备面试。我知道,机会不是突然砸下来的,而是在无数个&nbsp;“没结果”&nbsp;的日子里,一点点攒出来的。别人看得见的是&nbsp;offer,看不见的是你无数个默默坚持的日常。今天的我,值得被夸,因为我依然对明天抱有期待。就算今天一无所获,就算眼前一片静悄悄,我也没有彻底失望。我相信,春招很长,机会很多,不是只有跑得快的人才能赢,能坚持到最后的人,同样会发光。我相信,我投出的每一份简历、改的每一个字、熬过的每一次情绪,都在悄悄铺路。也许明天,也许后天,也许下周,那个属于我的面试,就来了。我想把这些话,也送给正在看这篇文章的你。如果你今天&nbsp;0&nbsp;面试,没有消息,没有回应,甚至有点失落、有点迷茫,请一定停下来,好好夸夸自己。你值得被夸,因为你没有放弃。你值得被夸,因为你在默默努力。你值得被夸,因为你在情绪里依然保持清醒。你值得被夸,因为你认真生活,认真对待自己。我们总以为,只有成功才值得庆祝,只有上岸才值得骄傲。可人生不是只有高光时刻才&nbsp;meaningful,那些低谷里的坚持、迷茫里的不妥协、疲惫里的不垮掉,才是最珍贵的部分。春招不是短跑,是长跑。有人跑得快,有人跑得稳,有人跑得慢,但只要不停下来,就一定会到达终点。今天的你,也许没有面试,没有喜讯,没有惊喜。但你早起了,你投简历了,你改简历了,你好好吃饭了,你稳住情绪了,你没有放弃自己了。就凭这些,你已经很棒了。允许自己暂时没有结果,允许自己慢慢来,允许自己在安静里积蓄力量。你做的每一件小事,都在让你离梦想更近一点。最后,再认真地夸一次今天的自己:我真的很不错,我一直在努力,我值得更好的机会,我一定会上岸。也愿每一个正在春招里默默坚持的人:简历被认真看见,努力被温柔回应,期待终会落地,所有漫长的等待,都换来值得的结果。你已经很棒了,再坚持一下,好运正在赶来。
虽然0面试,但今天___...
点赞 评论 收藏
分享
03-24 21:49
门头沟学院 Java
offer魅魔_oc...:100-200每天,你还要倒贴100
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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