【春招笔试】2025.05.04字节春招笔试题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时:90分钟/套)
  • 对照解析查漏补缺

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

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

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

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

字节

题目一:不可能三角

1️⃣:将数组排序,使用贪心算法

2️⃣:检查是否存在三个数 a[i-2] + a[i-1] <= a[i]

难度:中等

这道题目考察了三角形的基本性质和排序算法的应用。通过排序后检查相邻元素,我们可以在 O(n log n) 的时间复杂度内解决问题,有效处理大规模输入数据。

题目二:子串查询大师

1️⃣:预处理所有长度不超过10的子串

2️⃣:使用哈希表存储每个子串出现的次数

3️⃣:对每次查询直接返回哈希表中的结果

难度:中等

这道题目结合了字符串处理和哈希表应用。通过预处理所有可能的子串,我们可以快速响应多次查询,实现高效的字符串模式匹配。

题目三:连续翻转魔法

1️⃣:直接模拟翻转过程

2️⃣:依次翻转每个长度为k的子串

3️⃣:返回最终字符串状态

难度:简单

这道题目主要考察模拟能力和基本的字符串操作。通过按照题目要求直接模拟翻转过程,我们可以在 O(n×k) 的时间复杂度内解决问题。

题目四:博物馆珍藏配对

1️⃣:统计艺术价值和历史价值的出现次数

2️⃣:利用容斥原理计算满足条件的组合数

3️⃣:计算 C(n,3) - A - B + AB 得到最终答案

难度:中等偏难

这道题目结合了组合计数和容斥原理。通过巧妙运用容斥原理,我们可以在 O(n) 的时间复杂度内计算满足特定条件的选择方案数,避免了枚举所有组合的高复杂度。

01. 不可能三角

问题描述

小基 正在研究几何学,她对三角形特别感兴趣。众所周知,三角形的三边需要满足:任意两边之和大于第三边。小基 有一个长度为 的正整数数组,她想知道能否从中选出三个数,使它们不能构成三角形。

输入格式

第一行输入一个正整数 ,代表测试数据组数。

对于每组测试数据,第一行输入一个正整数 ,代表数组长度。

第二行输入 个正整数 ,代表数组的元素。

输出格式

输出 行,每行输出 "Yes" 或 "No"。如果能找出三个数不能构成三角形,则输出 "Yes",否则输出 "No"。

样例输入

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

样例输出

No
Yes

数据范围与样例说明

样例 解释说明
样例1 数组中任意三个数字都能构成三角形,所以输出 "No"。
样例2 可以选择 1, 1, 5,因为 1+1=2 < 5,所以这三个数不能构成三角形,输出 "Yes"。

题解

这道题考察的是三角形的性质:三条边能否构成三角形的充要条件是任意两边之和大于第三边。

首先,我们可以对数组进行排序。在排序后的数组中,我们只需要检查是否存在相邻的三个数满足条件 (其中)。

为什么只需要检查相邻的三个数呢?因为如果存在三个数不能构成三角形,那么最大的那个数一定是第三边(否则三个数中最大的两个数之和会更大,更容易满足构成三角形的条件)。而在已经排序的数组中,如果我们固定了最大的数,那么为了使条件成立,我们应该选择最小的两个数,即

当我们找到一组满足条件的三个数后,就可以确定答案为"Yes";如果遍历完整个数组都没有找到,那么答案就是"No"。

时间复杂度分析:排序的时间复杂度是,遍历检查的时间复杂度是,所以总的时间复杂度是,对于给定的数据范围()是完全可以接受的。

参考代码

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

def check(arr):
    """检查是否存在三个数不能构成三角形"""
    arr.sort()  # 对数组进行排序
    n = len(arr)
    # 检查是否存在 a[i-2] + a[i-1] <= a[i]
    for i in range(2, n):
        if arr[i-2] + arr[i-1] <= arr[i]:
            return True
    return False

# 读取测试用例数量
t = int(input())
for _ in range(t):
    n = int(input())  # 读取数组长度
    nums = list(map(int, input().split()))  # 读取数组
    if check(nums):
        print("Yes")
    else:
        print("No")
  • Cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 检查是否存在三个数不能构成三角形
bool check(vector<long long>& arr) {
    sort(arr.begin(), arr.end()); // 对数组排序
    int n = arr.size();
    // 检查是否存在 a[i-2] + a[i-1] <= a[i]
    for (int i = 2; i < n; i++) {
        if (arr[i-2] + arr[i-1] <= arr[i]) {
            return true;
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t;
    cin >> t; // 读取测试用例数量
    
    while (t--) {
        int n;
        cin >> n; // 读取数组长度
        
        vector<long long> nums(n);
        for (int i = 0; i < n; i++) {
            cin >> nums[i]; // 读取数组元素
        }
        
        if (check(nums)) {
            cout << "Yes" << "\n";
        } else {
            cout << "No" << "\n";
        }
    }
    
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    // 检查是否存在三个数不能构成三角形
    static boolean check(long[] arr) {
        Arrays.sort(arr); // 对数组排序
        int n = arr.length;
        // 检查是否存在 a[i-2] + a[i-1] <= a[i]
        for (int i = 2; i < n; i++) {
            if (arr[i-2] + arr[i-1] <= arr[i]) {
                return true;
            }
        }
        return false;
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine().trim()); // 读取测试用例数量
        
        for (int tc = 0; tc < t; tc++) {
            int n = Integer.parseInt(br.readLine().trim()); // 读取数组长度
            String[] tokens = br.readLine().trim().split(" ");
            long[] nums = new long[n];
            
            for (int i = 0; i < n; i++) {
                nums[i] = Long.parseLong(tokens[i]); // 读取数组元素
            }
            
            if (check(nums)) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }
}

02. 子串查询大师

问题描述

小柯最近在研究文本处理算法。她拿到了一个仅由小写英文字母组成的字符串,现在她想知道某个单词在该字符串中出现了多少次。由于小柯对许多不同的单词都感兴趣,她需要你帮她解决多次查询的问题。

输入格式

第一行输入两个正整数 ,代表字符串长度和询问次数。

第二行输入一个长度为 的,仅由小写英文字母组成的字符串,代表小柯拿到的字符串。

接下来的 行,每行输入一个仅由小写英文字母组成的字符串,代表小柯的每次查询。

输出格式

输出 行,每行输出一个整数,代表该次查询的结果。

样例输入

10 3
bobobalice
bob
alice
red

样例输出

2
1
0

数据范围与样例说明

样例 解释说明
样例1 在字符串"bobobalice"中,"bob"出现了2次(位置0-2和2-4),"alice"出现了1次(位置5-9),"red"没有出现过。
  • 每次查询的字符串长度不超过

题解

这道题要求我们统计给定单词在字符串中出现的次数。有几种常见的解法:

方法一:暴力匹配

最直接的想法是对于每次查询,遍历原字符串的每个位置,检查是否与查询的单词匹配。这种方法时间复杂度为O(n×m×q),其中m是查询单词的平均长度。但由于数据规模较大(n,q≤10^5),这种方法可能会超时。

方法二:预处理所有子串

更高效的方法是预先处理原字符串的所有可能子串并统计它们的出现次数。由于题目限制查询的字符串长度不超过10,我们可以预处理出原字符串中所有长度不超过10的子串,并用哈希表记录每个子串出现的次数。

具体步骤:

  1. 使用哈希表存储所有可能的子串及其出现次数
  2. 对于原字符串的每个位置i,枚举所有可能的长度len (1到min(10, n-i))
  3. 提取子串s[i:i+len]并在哈希表中增加计数
  4. 对于每次查询,直接从哈希表中获取结果

这种方法的时间复杂度是O(n×min(10,n) + q),对于给定的数据范围是完全可接受的。空间复杂度为O(n×min(10,n)),用于存储所有可能的子串。

需要注意的是,虽然理论上可能的子串数量级是O(n×min(10,n)),但实际上很多子串会重复出现,所以哈希表的实际大小可能会小得多。

参考代码

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

# 读取输入
n, q = map(int, input().split())
s = input()

# 预处理所有长度不超过10的子串
sub_cnt = {}
for i in range(n):
    # 枚举所有可能的子串长度
    for ln in range(1, min(11, n-i+1)):
        sub = s[i:i+ln]
        sub_cnt[sub] = sub_cnt.get(sub, 0) + 1

# 处理查询
for _ in range(q):
    word = input()
    # 从哈希表中获取结果
    print(sub_cnt.get(word, 0))
  • Cpp
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, q;
    cin >> n >> q;
    string s;
    cin >> s;
    
    // 预处理所有长度不超过10的子串
    unordered_map<string, int> cnt;
    for (int i = 0; i < n; i++) {
        string sub = "";
        // 枚举所有可能的子串长度
        for (int len = 1; len <= 10 && i + len <= n; len++) {
            sub += s[i + len - 1];
            cnt[sub]++;
        }
    }
    
    // 处理查询
    while (q--) {
        string word;
        cin >> word;
        cout << cnt[word] << "\n";
    }
    
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader b

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

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

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

全部评论

相关推荐

昨天 15:09
已编辑
上海大学 Java
忙碌的芝士选钝角:招侦探?
点赞 评论 收藏
分享
虽然笔试没过,但还是参加一下AI面试,以下是记录总结。1.计算机网络:TCP的粘包问题(刚背的,可熟悉了)回答:在网络拥塞或者Nagle算法中,会将多个TCP包合在一起,但是TCP在传输中是以字节流形式的,粘在一起之后没办法区分包之间的边界,例如发送两个数据包Hello&nbsp;和World,合在一起后,接收方收到的是HelloWorld。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解决办法主要有四个,第一个是固定数据包的大小,发生粘包后根据字节大小切分,但这样比较死板;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二种是在数据包末尾加入&quot;\n&quot;的分隔符,但是在中间文本中出现了分隔符的话,需要进行转义;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三种是在TCP报文前加入一个字段,记录这个包的大小,这种比较常用;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第四种是对协议进行限制,例如禁用Nagle算法,不允许合并数据包。2.Linux:grep如何使用(确实没准备)回答:完全不会。3.Java:装箱和拆箱是什么,举一个例子。回答:举了int型和Integer类的例子,一些接口使用的时候会发生拆箱和装箱(但我不太记得了)4.高并发:解决投票中刷票问题回答:使用IP检测,限制单个IP的高频访问。追问:要是对方使用代理IP,或者IP连接池该怎么解答回答:根据行为检测,刷票行为和个人投票行为肯定存在差异(但我不知道差异是什么)5.数据库:主键的作用是检索到这条数据的唯一标识,也用来构建聚簇索引。(应该还有其他作用但我忘了。)6.通用问题1:学习新技术的路线回答:阅读官方文档,对于难点搜索视频讲解或者Github文档;项目实战有问题去找熟悉项目的技术人员。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;追问1:如何判断学习资料是否有用,是否走过弯路&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回答:根据点赞量,Start量。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;追问2:走过弯路后下次如何判断?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回答:根据文档关键词判断对我是否有帮助?7.通用问题2:你项目中遇到的难点怎么解决追问1:如何通过持续改进解决一个一直出现的问题追问2:如何平衡局部调优和整体的稳定性8.通用问题3:你未来3年的职业规划回答:1-2年熟悉公司技术栈,后续熟悉公司业务流程,做到技术和业务两手抓。最后给出DeepSeek的回答。1.计算机网络:TCP的粘包问题 &nbsp;TCP粘包问题是由于TCP是面向字节流的协议,发送端可能将多个数据包合并发送(如Nagle算法或网络拥塞),接收端无法区分数据边界。例如发送&quot;Hello&quot;和&quot;World&quot;,接收端可能收到&quot;HelloWorld&quot;。&nbsp;解决方案&nbsp;:●&nbsp;固定包长度&nbsp;:每个包固定为相同长度(不足时填充),接收方按固定长度拆分。缺点是灵活性差,适合固定格式场景。●&nbsp;分隔符&nbsp;:在数据包末尾添加特殊字符(如\n),接收方按分隔符拆分。需处理数据中的转义字符(如HTTP头用\r\n\r\n)。●&nbsp;头部声明长度&nbsp;:在报文头部添加长度字段(如4字节表示包体长度),接收方先读头部,再按长度截取数据。这是最常用的方式(如HTTP的Content-Length)。●&nbsp;禁用Nagle算法&nbsp;:通过TCP_NODELAY选项关闭合并优化,但可能增加小包传输次数,影响性能。2.Linux:grep如何使用 grep用于文本搜索,常见用法:●&nbsp;基本搜索&nbsp;:grep&nbsp;&quot;pattern&quot;&nbsp;file.txt●&nbsp;递归搜索目录&nbsp;:grep&nbsp;-r&nbsp;&quot;pattern&quot;&nbsp;/path/to/dir●&nbsp;忽略大小写&nbsp;:grep&nbsp;-i&nbsp;&quot;pattern&quot;&nbsp;file.txt●&nbsp;显示行号&nbsp;:grep&nbsp;-n&nbsp;&quot;pattern&quot;&nbsp;file.txt●&nbsp;反向匹配(排除)&nbsp;&nbsp;:grep&nbsp;-v&nbsp;&quot;pattern&quot;&nbsp;file.txt●&nbsp;正则表达式&nbsp;:支持^(行首)、$(行尾)、.(任意字符)等,如grep&nbsp;&quot;^start&quot;&nbsp;file.txt。3.Java:装箱和拆箱是什么,举一个例子 ●&nbsp;装箱(Autoboxing)&nbsp;&nbsp;:将基本类型转换为包装类,如int&nbsp;→&nbsp;Integer。●&nbsp;拆箱(Unboxing)&nbsp;&nbsp;:将包装类转换为基本类型,如Integer&nbsp;→&nbsp;int。Integer&nbsp;a&nbsp;=&nbsp;10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;自动装箱(底层调用Integer.valueOf(10))&nbsp;&nbsp;int&nbsp;b&nbsp;=&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;自动拆箱(底层调用a.intValue())&nbsp;&nbsp;4.&nbsp;高并发:解决投票中刷票问题&nbsp;●&nbsp;基础防御&nbsp;:&nbsp;&nbsp;IP限流&nbsp;:限制同一IP单位时间内的请求次数(如Redis计数器+过期时间)。○&nbsp;用户鉴权&nbsp;:要求登录后投票,限制每个用户的投票次数。○&nbsp;验证码&nbsp;:在频繁请求时触发验证码(如滑动拼图、短信验证)。●&nbsp;对抗代理/IP池&nbsp;:&nbsp;&nbsp;设备指纹&nbsp;:通过浏览器指纹(UserAgent、Canvas渲染)、设备ID等标识唯一设备。○&nbsp;行为分析&nbsp;:检测异常行为(如毫秒级连续投票、无页面停留直接提交)。○&nbsp;风控系统&nbsp;:实时分析请求特征(IP地理分布、时间分布),拦截异常流量。●&nbsp;业务层优化&nbsp;:&nbsp;&nbsp;异步队列削峰&nbsp;:将投票请求放入消息队列,后端批量处理,避免瞬时高并发。5.&nbsp;&nbsp;数据库:主键的作用&nbsp;●&nbsp;唯一标识&nbsp;:确保每行数据的唯一性(如自增ID、UUID)。●&nbsp;聚簇索引&nbsp;:InnoDB中主键默认作为聚簇索引,数据按主键顺序物理存储,加快检索速度。●&nbsp;外键关联&nbsp;:主键作为其他表的外键,维护数据一致性。●&nbsp;优化查询&nbsp;:主键查询最快(如WHERE&nbsp;id=1),避免全表扫描。●注意事项&nbsp;:避免业务字段做主键(如身份证号),优先使用无意义的自增ID。●复合主键需谨慎,可能增加索引复杂度。6.&nbsp;&nbsp;通用问题1:学习新技术的路线&nbsp;●&nbsp;学习路径&nbsp;:&nbsp;&nbsp;官方文档&nbsp;:掌握核心概念和最佳实践(如Spring&nbsp;Boot的Spring.io)。&nbsp;&nbsp;&nbsp;&nbsp;○&nbsp;实践项目&nbsp;:通过小项目验证技术点(如用Redis实现分布式锁)。&nbsp;&nbsp;&nbsp;&nbsp;○&nbsp;源码与社区&nbsp;:阅读源码、参与GitHub讨论(如Dubbo的Issue)。●&nbsp;判断资料质量&nbsp;:&nbsp;&nbsp;筛选标准&nbsp;:作者权威性(如Oracle认证工程师)、内容更新日期、社区评价(Stack&nbsp;Overflow投票)。&nbsp;&nbsp;&nbsp;&nbsp;○&nbsp;避免弯路&nbsp;:优先选择官方推荐资源,再参考高星GitHub项目或经典书籍(如《Effective&nbsp;Java》)。●&nbsp;持续改进&nbsp;:&nbsp;定期复盘学习效果,建立知识体系脑图,与团队分享经验。7.&nbsp;&nbsp;通用问题2:项目难点解决&nbsp;&nbsp;结构化回答(STAR模型)&nbsp;&nbsp;:●&nbsp;情境(Situation)&nbsp;&nbsp;:在XX项目中,接口响应慢,导致超时报警。●&nbsp;任务(Task)&nbsp;&nbsp;:需在1周内将平均响应时间从2s优化至200ms内。●&nbsp;行动(Action)&nbsp;&nbsp;:&nbsp;&nbsp;定位瓶颈&nbsp;:通过Arthas追踪调用链,发现SQL查询耗时占80%。○&nbsp;优化SQL&nbsp;:添加索引、重构分页查询,减少全表扫描。○&nbsp;缓存引入&nbsp;:对热点数据(如配置信息)增加Redis缓存。●&nbsp;结果(Result)&nbsp;&nbsp;:响应时间降至150ms,且通过压测验证稳定性。●平衡调优与稳定&nbsp;:局部优化前评估影响范围,通过灰度发布观察效果。●监控核心指标(CPU、内存、错误率),确保优化不引发链式故障。8.&nbsp;&nbsp;通用问题3:未来3年的职业规划&nbsp;●&nbsp;短期(1年)&nbsp;&nbsp;:&nbsp;深入掌握公司技术栈(如微服务架构、中间件),成为团队核心开发。○参与高复杂度模块(如分布式事务、性能优化)。●&nbsp;中期(2年)&nbsp;&nbsp;:&nbsp;提升架构设计能力,主导跨系统方案设计(如亿级流量系统)。○培养业务洞察力,推动技术与业务融合(如通过数据驱动产品决策)。●&nbsp;长期(3年)&nbsp;&nbsp;:&nbsp;向技术管理者或架构师转型,负责技术选型与团队规划。○持续学习行业前沿(如云原生、AI工程化),保持技术敏感度。
美团AI面330人在聊 查看12道真题和解析
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客企业服务