【笔试刷题】淘天-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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

昨天 22:51
已编辑
重庆大学 Java
面试时间:4.3上午11点,全程40min左右(开始ai&nbsp;coding没写完,面试官给了几分钟让写ai&nbsp;coding)面试官先跟我说明了一下一共2轮技术面+1轮hr面,但是实习生的话,hr一般都不面试。1、AI&nbsp;Coding:AI处理违规评论。生成的很慢,甚至pom.xml写进去之后又被ai自己删掉了,整个项目爆红;然后跟面试官讲了一下思路;面试官问我是不是做过类似的功能,我说没有做过,只是这个应用场景自己平时用社交媒体比较多,所以比较熟悉。还针对AI&nbsp;Coding问了些问题:你认为你刚刚在AI&nbsp;Coding的过程中存在的问题是什么?你怎么看待AI&nbsp;Coding的,你认为是机会,还是挑战?2、自我介绍简要介绍了一下项目里完成的流程和功能。然后面试官说一面已经问过项目细节,就不再展开。3、面试官把官网简历上的项目名都念了一遍,问你做这些项目的背景和动机是什么?主要讲了rag项目的动机,从兴趣到可应用场景的思考。4、项目中有遇到什么困难吗?讲了会话记忆的方案选型,延申到了Claude&nbsp;Code的会话记忆。5、项目中有哪些没有达到自己预期的地方?没有数字化的评估,从忠实度、相关度、准确率、召回率四个指标讲如果要做评估,已有的一些思路。6、你觉得你做完这个项目之后,你的收获是什么?了解目前agent领域已有的技术沉淀和应用。rag项目讲完之后,面试官应该也看出来了,就说后面两个项目应该都是学习项目吧,答是。面试官提到动态线程池项目,我就问美团是不是有专门的技术专家去研发动态线程池,因为我最早学动态线程池就看到是美团的技术专家牵头的。面试官说每个企业都有自己的动态线程池,然后跟我讲了动态线程池主要是为了解决什么样的问题,讲的很具体,最后面试官讲完之后,我给面试官了一个肯定(哈哈哈有点倒反天罡)7、闲聊你这个成绩,应该可以保研啊,考虑保研吗?你老家是哪的?入职时间,实习时间?毕设什么时候?反问1、业务是什么?2、如果有幸入职,我的工作是什么?3、面试表现如何?面试官说可能有些问题没有提前准备(感觉可能这个地方有点寄,有些问题都是临时往自己知道的方向去硬扯的,而且表达的也不是特别清晰),但是临场反应不错。4、面试结果什么时候出来?一周内,如果有什么问题后面hr会联系。4.9中午发短信问二面面试官结果大概什么时候出,下午回复说“耐心等一等,已经有结论了”,我寻思着我应该不是面试官的第一选择,他们后面还要来个究极大横向。目前官网流程仍然显示“面试”状态,简历可能被锁住了,还没有回人才库。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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