【笔试刷题】顺丰-2026.03.15-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

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

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

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

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

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

顺丰-2026.03.15

1. 等距货架

问题描述

小基 正在整理一排长度为 的货架,第 个位置上放着一件编号为 的货物。

她想从中挑出若干个位置,要求同时满足下面两个条件:

  • 挑出的货物编号完全相同。
  • 这些位置编号从小到大看,能够组成一个等差数列。

请计算,最多可以挑出多少个位置。

输入格式

第一行包含一个整数 ,表示数据组数。

对于每组数据:

第一行包含一个整数 ,表示货架位置数量。

第二行包含 个整数 ,表示每个位置上的货物编号。

输出格式

对于每组数据输出一行一个整数,表示最多能挑出的元素个数。

样例输入

2
1
1
6
1 2 3 2 3 2

样例输出

1
3

数据范围

样例 解释说明
样例 1 组数据只有一个位置,所以答案是
组数据里,值为 的位置是 ,它们本身就是公差为 的等差数列,因此答案是

题解

问题的本质

这道题有两个条件必须同时满足:

  1. 选出来的元素值要一样。
  2. 选出来的位置要等距。

所以不能只看某个值出现了多少次。
如果某个值出现在位置 ,虽然一共出现了 次,但这三个位置并不能组成等差数列,不能一起选。

真正要做的是:
对每一种值,单独看它出现在哪些位置,然后在这串位置里找最长等差子序列。

第一步:按值分组

从左到右扫描数组,把每个值出现的位置记录下来。

如果值 出现的位置依次是:

那么原问题就变成了:

在严格递增的位置序列 中,最长等差子序列有多长?

每个值各算一次,最后取最大值即可。

第二步:在位置序列里做最长等差子序列

设当前位置序列为

定义状态

表示以 结尾,公差为 的等差子序列最长长度。

现在枚举最后两个位置 ,其中
公差自然就是:

接下来分两种情况:

  • 如果之前已经存在一个以 结尾、公差同样为 的序列,那么可以把 接到后面,长度变成
  • 如果不存在,那就说明只能从 这两个位置重新开始,长度是

于是转移就是:

因为位置编号最大只有 ,所以公差 的范围最多是 ,直接按公差开数组就够了。

为什么这样做是对的

等差子序列最关键的信息只有两个:

  • 最后一个位置是谁。
  • 公差是多少。

只要这两个量确定了,前面能接多长就已经完全由更早的状态决定。
所以用 表示“以某个位置结尾、且公差固定”的最优结果,信息是完整的,不会漏掉答案。

当枚举到一对位置 时:

  • 若前面有同公差的合法序列,就延长它。
  • 若前面没有,就把这两个位置当成新序列的开头。

这正好覆盖了所有可能的等差子序列,因此最终取最大值就是答案。

复杂度分析

假设某个值一共出现了 次,那么处理这一组位置需要枚举所有位置对,复杂度是

所有值的出现次数之和正好是 ,因此总复杂度满足:

空间复杂度同样是单组 ,在 的范围内可以接受。

一个容易错的点

有些做法会先统计每个值的出现次数,再想办法补一个“位置等距”的判断。这样很容易绕弯。

更直接的想法是先按值分组,把“值相同”这个条件彻底消掉。
剩下就是标准的“位置序列最长等差子序列”问题,状态也会清楚很多。

参考代码

  • Python
import sys
from array import array

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


def calc(pos, n):
    m = len(pos)
    if m <= 1:
        return m

    # f[j][d] 表示以 pos[j] 结尾、公差为 d 的最长长度。
    f = [array('H', [0]) * (n + 1) for _ in range(m)]
    ans = 1

    for j in range(m):
        row = f[j]
        pj = pos[j]
        for i in range(j):
            d = pj - pos[i]
            pre = f[i][d]
            cur = pre + 1 if pre else 2
            if cur > row[d]:
                row[d] = cur
                if cur > ans:
                    ans = cur

    return ans


def solve():
    t = int(input())
    out = []

    for _ in range(t):
        n = int(input())
        arr = list(map(int, input().split()))
        grp = [[] for _ in range(1001)]

        # 同一个值出现在哪些位置,全部记下来。
        for i, x in enumerate(arr, 1):
            grp[x].append(i)

        ans = 1
        for pos in grp:
            if len(pos) > ans:
                ans = max(ans, calc(pos, n))

        out.append(str(ans))

    sys.stdout.write("\n".join(out))


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

int calc(const vector<int>& pos, int n) {
    int m = (int)pos.size();
    if (m <= 1) {
        return m;
    }

    // f[j][d] 表示以 pos[j] 结尾、公差为 d 的最长长度。
    vector<vector<unsigned short>> f(m, vector<unsigned short>(n + 1, 0));
    int ans = 1;

    for (int j = 0; j < m; ++j) {
        for (int i = 0; i < j; ++i) {
            int d = pos[j] - pos[i];
            unsigned short cur = f[i][d] ? (unsigned short)(f[i][d] + 1) : 2;
            if (cur > f[j][d]) {
                f[j][d] = cur;
            }
            ans = max(ans, (int)f[j][d]);
        }
    }

    return ans;
}

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

    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;

        vector<vector<int>> grp(1001);
        for (int i = 1; i <= n; ++i) {
            int x;
            cin >> x;
            grp[x].push_back(i);
        }

        int ans = 1;
        for (const auto& pos : grp) {
            if ((int)pos.size() > ans) {
                ans = max(ans, calc(pos, n));
            }
        }

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

public class Main {
    static int calc(ArrayList<Integer> pos, int n) {
        int m = pos.size();
        if (m <= 1) {
            return m;
        }

        // f[j][d] 表示以 pos[j] 结尾、公差为 d 的最长长度。
        short[][] f = new short[m][n + 1];
        int ans = 1;

        for (int j = 0; j < m; j++) {
            int pj = pos.get(j);
            short[] row = f[j];
            for (int i = 0; i < j; i++) {
                int d = pj - pos.get(i);
                int cur = f[i][d] == 0 ? 2 : f[i][d] + 1;
                if (cur > row[d]) {
                    row[d] = (short) cur;
                }
                if (row[d] > ans) {
                    ans = row[d];
                }
            }
        }

        return ans;
    }

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);
        StringBuilder sb = new StringBuilder();
        int t = fs.nextInt();

        while (t-- > 0) {
            int n = fs.nextInt();
            @SuppressWarnings("unchecked")
            ArrayList<Integer>[] grp = new ArrayList[1001];
            for (int i = 0; i <= 1000; i++) {
                grp[i] = new ArrayList<>();
            }

            for (int i = 1; i <= n; i++) {
                int x = fs.nextInt();
                grp[x].add(i);
            }

            int ans = 1;
            for (ArrayList<Integer> pos

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

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

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

全部评论

相关推荐

03-17 21:50
已编辑
郑州大学 Java
部门:公众号和小程序部门(是wxg吧)45分钟三道算法1.字符串可交换,输入几个pair可交换&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;几个联通图dfs遍历打标记(没输出,思路感觉ok)2.链表删重复元素&nbsp;&nbsp;&nbsp;&nbsp;感觉没问题但是吧while(cin&nbsp;&gt;&gt;&nbsp;n)跳不出来啊(没输出,思路我觉得行)3.数n的阶乘后面几个0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(来不及做了状态很差)实习部分&nbsp;&nbsp;:有个点没答好现在突然明白面试官问的啥意思了项目:你咋会问短连接的,我真没想到,好久没复习了1.架构&nbsp;&nbsp;&nbsp;&nbsp;我答的网关和服务,我哪知道中间件也算2.布隆过滤器a.满了咋办b.不过对业务场景有影响吗c.分布式下有考虑吗&nbsp;&nbsp;&nbsp;单体项目3.修改场景怎么保持一致性的这么简单(但是我说了方法啊,你又重复问我给我问蒙了,我还以为我忘了,扯到别的上了毫无价值)4.消息队列幂等(说了一大半差一点就要忘了,还好下一个了)5.分布式锁这边锁什么,那你要求key访问多少呢?没说答案直接答到本地锁了,又问用本地锁没考虑过redis充分发挥性能吗?我直接给爆了,二次开发的没考虑过机器(真神志不清了)八股:https底层(磕磕绊绊讲了下,讲的不好,过程都没讲清)无反问感觉挂了反思:好多地方我都讲太差了,他妈我还爆了,真复习了一天晚上神志不清有点,我昨晚俩小时过了一遍hot100,复习了一下午八股,面完感觉累的相似,整体来说就是好多真是答的不到点上吧(我真有点累),不然的话还凑合复盘了一下爆哭,我必须意识到这是否是我此生仅有的机会半小时出结果挂我适合互联网吗?面过三家大厂,虾皮字节腾讯全部一面挂,感觉是不是应该随便找个公司一月几千混混得了(苦笑)
查看12道真题和解析
点赞 评论 收藏
分享
感谢沉默王二,星球的八股和项目帮助我顺利拿下offer!向牛牛们安利,性价比无敌。面经分享:五面腾讯,实习提前批1.15&nbsp;pcg一面&nbsp;非常抽象,全程共享屏幕看我的项目代码,现场进行增加功能,最后idea手写2个线程池,进行通信1.20&nbsp;pcg二面&nbsp;也非常抽象,中间共享屏幕,画kafka集群架构,边画边讲解,各个环节出问题怎么应对。&nbsp;共享屏幕去github看mysql源码,让我讲。聊了特别多人生观,价值观,学习方式等等&nbsp;最后让我写了一个比较简单的算法题,全程100分钟。提前批1.27一面&nbsp;同事1.聊聊spring&nbsp;cloud体系2.spring&nbsp;mvc的流程3.分布式锁的实现方式,还有什么其他的实现方式4.直接写过原生lua脚本吗5.秒杀系统,怎么实现的?流量怎么控制的6.kafka兜底这一块怎么实现7.幂等表具体怎么实现的8.kafka发送数据写任务表,是发送前写还是发送后写9.怎么保证消息一定发送成功10.哪里用到了分布式事务11.java线程池,线程池参数12.你项目中哪里用了?怎么设置参数的,依据是什么13.聊聊threadlocal(我结合项目,顺便聊到了inheritablethreadlocal,transmittablethreadlocal)14.threadlocal存在的问题,原因15.spring事务,失效的情况,事务传播16.项目中ai这一块怎么实现的17.ai驱动项目,ai干活18.git这一块,了解吗,常见命令19.tcp和udp20.tcp握手可以是两次吗,四次吗?21.数据库底层结构22.sql比较慢,怎么处理?算法:&nbsp;最小覆盖子串1.28二面&nbsp;+11.数据一致性这一块,你怎么处理的?2.缓存失效,有哪些失效策略?3.频繁应用的数据,怎么处理4.分布式事务的实现方式5.多线程的任务,怎么实现线程间的通信?6.分布式锁,技术选型7.Redisson可重入基层怎么实现的?8.分布式锁过程中宕机了怎么办?9.没有超过过期时间,中间CPU没有运行,怎么样提高效率?10.那这个线程恢复后,还能重入吗?11.分享一下你另外一个项目12.ai助手使用了什么框架?算法&nbsp;实现内存级缓存,要求可以根据时间自动过期后续就是聊性格,生活还有考研等等2.3三面&nbsp;+2主要是围绕我的动机和实习时长来挖坑,看我怎么应对和对于实习的态度。询问了项目是商业化还是练手项目技术方面:1.ai现在这么火,你怎么去应对的?了解多少2.尝试过ai编程吗,具体怎么做的3.利用ai的时候,团队协作,编码有固定的格式,该怎么办?4.rag召回,有哪些算法?5.脑筋急转弯,3l水&nbsp;5l水问题6.秒杀逻辑,防止超卖的核心逻辑7.核心业务失败,怎么办?8.加锁了,并发性能怎么保证呢9.商品库存信息,怎么存放的10.支付失败的话,直接更新缓存吗?高并发情况下,会有什么问题呢11.如果是淘宝这种量级,库存出现数据不一致怎么办,怎么恢复数据12.单线程保证线程安全,有哪些方式?13.为什么要用双重检查模式14.为什么学java15.现在ai这么火,但是你的ai经验比较弱,这是为什么?为什么没有主动去补一下2.4hr&nbsp;电话面hr小姐姐,态度很好,介绍业务,薪资,跟我说拉我进群。电话结束就加了微信,说offer2到3个工作日发下来
如何让HR爱上我:项目都是编的,屏幕共享跟恐怖故事似的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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