【笔试刷题】淘天-2026.04.08-工程岗-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

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

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

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

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

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

淘天-2026.04.08-工程岗

三道题整体偏建模,算法本身不复杂,难点在读清题意。第一题是字符串拆分的合法性判定,第二题需要先梳理清楚交换操作所保持的不变量,第三题按值离线处理,逐步统计各元素的贡献。

1. 毛利兰的字符串核查

问题描述

毛利兰在整理一批案件文字记录时,发现某些字符串恰好可以由同一批记录中的另外两条拼接而成。她需要将这类字符串统计出来。

形式化定义:给定一个由非空小写字符串构成的序列,若字符串 满足——存在两个不同下标 ,使得 均为非空字符串,且 ——则称下标 对应的字符串为可删去的

统计每组数据中可删去字符串的下标总数。

输入格式

每个测试文件包含多组测试数据。

  • 第一行输入一个整数 ,表示测试组数。
  • 对于每组测试数据:
    • 第一行输入一个整数 ,表示字符串数量。
    • 接下来输入 行,每行一个只含小写字母的非空字符串。

输出格式

对于每组测试数据,输出一行一个整数,表示可删去的字符串下标数量。

样例输入

2
5
a
b
ab
abc
bc
4
a
aa
a
aaa

样例输出

2
2

数据范围

  • 单个测试文件中,所有测试数据的 之和不超过
  • 单个测试文件中,所有字符串长度之和不超过
  • 每个字符串只包含小写字母,且长度至少为

样例解释1

第 1 组:ab = a + babc = a + bc,共 2 个可删去字符串。

样例解释2

第 2 组:序列中有两个 a,可以拼成 aa;任意一个 aaa 可以拼成 aaa,答案同样为 2

题解

枚举策略

对目标串 (长度为 )逐一枚举切分点 ,其中 ,将其拆成前半段 与后半段 ,检查这两个子串是否均在原序列中存在。只要存在某个切分点使两段同时命中, 即为可删去的。

相同下标的处理

当前缀与后缀内容不同时,只需二者均在序列中出现过,必然对应不同位置,无需额外处理。

需要特别考虑的情形是前缀与后缀完全相同——此时要求该字符串在原序列中至少出现两次,才能取到两个不同下标完成拼接。

哈希加速

对每个切分点朴素截取子串并比较,最坏情形下时间复杂度退化为平方级别。题目给定"所有字符串长度之和不超过 ",适合采用前缀哈希(推荐双哈希以降低碰撞概率)处理:

  1. 将序列中每个完整字符串的哈希值存入哈希表,同时记录出现次数。
  2. 对每个字符串预处理前缀哈希数组。
  3. 枚举切分点时,以 时间取得前缀与后缀的哈希值。
  4. 在哈希表中查询两段是否存在(若前后缀相同,需检查出现次数是否 )。

每个字符仅被常数次处理,总体复杂度与输入规模线性相关。

复杂度分析

设所有测试数据的总字符串长度为

  • 时间复杂度:
  • 空间复杂度:

参考代码(Python)

import sys

def read_line():
    return sys.stdin.readline().strip()

def precompute_powers(limit):
    while len(pow_mod1) <= limit:
        pow_mod1.append(pow_mod1[-1] * BASE % MOD1)
        pow_mod2.append(pow_mod2[-1] * BASE % MOD2)

def hash_full(text):
    h1 = h2 = 0
    for ch in text:
        val = ord(ch) - 96
        h1 = (h1 * BASE + val) % MOD1
        h2 = (h2 * BASE + val) % MOD2
    return h1, h2

def prefix_hashes(text):
    length = len(text)
    pref1 = [0] * (length + 1)
    pref2 = [0] * (length + 1)
    for idx, ch in enumerate(text):
        val = ord(ch) - 96
        pref1[idx + 1] = (pref1[idx] * BASE + val) % MOD1
        pref2[idx + 1] = (pref2[idx] * BASE + val) % MOD2
    return pref1, pref2

def segment_hash(pref, start, end, power_list, mod):
    return (pref[end] - pref[start] * power_list[end - start]) % mod

def main():
    batches = int(read_line())
    results = []

    for _ in range(batches):
        count = int(read_line())
        strings = [read_line() for _ in range(count)]
        for s in strings:
            precompute_powers(len(s))

        hash_count = {}
        for text in strings:
            key = (len(text),) + hash_full(text)
            hash_count[key] = hash_count.get(key, 0) + 1

        total = 0
        for text in strings:
            size = len(text)
            if size < 2:
                continue

            pref1, pref2 = prefix_hashes(text)
            valid = False
            for split in range(1, size):
                left_key = (split, pref1[split], pref2[split])
                if hash_count.get(left_key, 0) == 0:
                    continue

                right_len = size - split
                right_h1 = segment_hash(pref1, split, size, pow_mod1, MOD1)
                right_h2 = segment_hash(pref2, split, size, pow_m

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

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

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

全部评论

相关推荐

04-16 14:42
浙江大学 C++
暑期实习&nbsp;timelinebg&nbsp;c9本,大二在华子实习过,所以对整个招聘的准备流程还是比较清楚的。从3月9号开始准备,一边刷leetcode、一边补八股、一边海投;最后被鹅厂收留,成为鹅孝子网易互娱&nbsp;服务端年前就投过一次提前批,但当时太菜了笔试根本过不了;3月份又给我发起一次笔试邀请,但依旧是没有准备好,所以又挂了;后知后觉地了解到原来没准备好可以不开始笔试,等下一批后面抓住机会去了线下的直通面试,结果是草台班子,根本没给我预留位置(公司还提前一两天打电话邀请我),结果就是不了了之,很愤怒网易雷火&nbsp;服务端雷火的笔试太难了,根本做不起,所以网申也寄了不过还是靠线下直通翻盘了,但是流程走太慢了,最后被鹅截胡3.18&nbsp;线下一面面试官是校友,问题现在来看很温和,一些八股+简单问了问实习和项目+手撕1.&nbsp;虚函数的实现2.&nbsp;1+2+...+n&nbsp;不用循环和乘法怎么算3.&nbsp;多重继承时的虚函数指针4.&nbsp;模板的原理,特化、偏特化5.&nbsp;TCP发送数据包整个网络过程,数据包怎么到路由器的6.&nbsp;路由器间的最优路径选择手撕:二叉搜索树原地转成双向链表4.10&nbsp;线上二面这个面试官很有趣,整体是诙谐轻松的风格,说一面问过的就不问了,题目直接就在牛客面试的ide里粘贴问我,不刁难人可跳题1.&nbsp;demo1和demo2表结构相同,把demo1里id=1的数据拷到demo2;但是我忘记怎么写sql语句了,讲了思路直接跳2.&nbsp;linux里&nbsp;`ls&nbsp;/file&nbsp;2&gt;&nbsp;/dev/null`&nbsp;什么意思3.&nbsp;localhost和127.0.0.1是什么4.&nbsp;有一个函数可以拿到时间戳的年、月、日、星期、时、分、秒,怎么判断两个时间戳在同一个自然周5.&nbsp;IEEE754能精确表示的最大整数是多少?6.&nbsp;为什么要序列化和反序列化,不能直接发送内存里的数据吗7.&nbsp;100万亿数据怎么去重,用最少的空间,大致是多少空间无手撕4.16&nbsp;三面(拒了,因为拿到offer了)米哈游&nbsp;服务端线下直通面:不问八股,全是各种设计题,拷打地哑口无言,挂1.&nbsp;一个装备合成的接口怎么设计,怎么保证不会吞我的材料2.&nbsp;玩家A、B分别在两台服务器上,怎么保证一个交易系统的可靠性?3.&nbsp;有一个业务需求:想在手机上通过聊天软件/通讯软件,去遥控PC上agent完成代码coding,每一步应该怎么设计。4.&nbsp;欲设计一个组队匹配系统,比如1~4人组队,进入一个100人的场景服务器,给你一个agent如何完成这个需求?oppo投的系统工程师,流程太慢,还有后来发现一开始那个岗位的工作地点不太满意,改投底软了,但是流程已经被之前的岗位卡住了,所以后面也不是很感冒了4.7&nbsp;一面项目+实习&nbsp;40min结束4.13&nbsp;二面项目+实习&nbsp;40min结束整体很温和,无八股和手撕,但是流程太慢,被截胡腾讯&nbsp;后台开始投的后台,但是过了一段时间被捞到了企微的客户端开发,懵懵懂懂地去试了手3.26&nbsp;客户端一面总时长2h,折磨到底(强度太大+面试官说广普听不太清)开局3道手撕:1.&nbsp;合并链表2.&nbsp;循环数组找最小值,题面是严格递增,做完后又问非严格递增怎么办3.&nbsp;手撕shared_ptr(引用计数+裸指针),我用的原子变量,然后面试官问了一些可能并发的问题,补了下互斥锁然后就拷打项目和实习,无八股,最后过了后来刷牛客发现客户端的坑,就赶紧润了,拒了二面4.1&nbsp;被小程序/公众号的后台开发捞起,开启终极考验4.1&nbsp;一面开局三道题:1.&nbsp;括号匹配2.&nbsp;寻找重复数3.&nbsp;手写LRU,顺着问了LRU并发的问题然后是设计题+拷打项目和实习4.2&nbsp;二面开局四道题:具体记不住了,不过应该都是leetcode原题问了几个设计题:1.&nbsp;chrome里是采用一个标签页一个进程还是一个标签页一个线程,为什么?2.&nbsp;io多路复用3.&nbsp;工作线程里遇到耗时操作怎么办,如果不改异步呢?可能还有但是忘了面完后好几天没有消息,挺慌的,现在想来应该是过清明去了4.8&nbsp;三面面试官比较温和,说前面手撕和拷打的够多了,这次轻松点,无手撕,问了些八股1.&nbsp;TCP头每个字段介绍一下2.&nbsp;TCP可靠传输怎么保证3.&nbsp;TCP的流量控制4.&nbsp;服务器A向B发送文件,怎么保证B收到的是A发出的两个文件(我讲的是设计应用层协议,然后具体给出了会用到的字段)5.&nbsp;如果网卡缓冲区满了会发生什么剩下就简单聊了聊项目和实习,差不多40min结束了4.14&nbsp;HR面4.15&nbsp;云证4.16&nbsp;oc其他公司京东投了没动静,美团投了没去笔试,vivo投了没动静,滴滴投了没动静,快手投了秒挂,pdd笔试后挂,蚂蚁笔试后挂重点提一下阿里和字节:阿里hr自动给我投了ai应用开发,编程题全ak,笔试完挂,不过也是意料之中,毕竟根本和agent开发不沾边;然后我投了阿里云c++和客户端,简历挂;投了灵犀互娱笔试编程全AK,挂;字节:投了好几个后端,几个星期没动静纯装死;过了一段时间,我发现tiktop&nbsp;shop的流程终于有推进了,不过是挂了,最草台班子的是部门hr还加我微信说看中了我的简历问我要不要面试,我说你不是给我挂了吗,不过重新开始了面试;然后一面的时候,面试官说我的技术栈出入有点大,问我怎么处理和调整,全程就问了项目和实习,无手撕,最终不了了之感慨这次暑期实习也是挺颠沛流离的,时间紧任务重,特别是前期疯狂地投递、疯狂地笔面,但是得到的全是挂挂挂;还有有些公司真的流程太慢,很耗人心神,纯消磨意志(这点必须表扬腾讯,效率太高了)然后几乎所有的面试都问了ai的使用情况,也是间接督促我该多看点agent内容了下面将成为严肃鹅孝子,开启一段广漂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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