【备战春招必看】字节跳动2025届第3套笔试解析 | 大厂真题通关指南
✅ 字节跳动春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题(建议用时:90分钟/套)
- 对照解析查漏补缺
- 配套练习题库
互联网必备刷题宝典🔗
📢 字节跳动技术岗笔试重要信息速览
⏰ 笔试时间安排
- 常规场次:每周六交替进行
- 上午场 10:00~12:00
- 晚间场 19:00~21:00
- 通知时间:提前2天通过邮箱发送考试链接
🧩 笔试题型分布
算法岗 | 选择题 + 4道编程 |
后端开发岗 | 选择题 + 3道编程 |
前端/测试岗 | 选择题 + 4道编程 |
⚙️ 考试设置要点
- 考试平台:牛客网(ACM模式)
- 监考要求:
- 必须开启笔记本前置摄像头
- 禁止使用手机(需小程序锁定)
- 允许使用本地IDE
- 编程规范:
- 严格遵循输入输出格式
- 注意时间复杂度控制(通常1s对应1e8次运算)
📚 笔试经验贴
(所有展示题面均已进行改编处理,保留核心考点)
本题库收录整理自:
- 互联网公开的笔试真题回忆版(经网友投稿)
- 各大技术社区公开讨论的经典题型
- 历年校招考生提供的解题思路
🔍 题库特点:
- 100%真实笔试场景还原
- 包含高频考点题型
- 提供多语言实现参考
- 持续更新2024届最新真题
⚠️ 注意事项:
- 所有题目均来自公开渠道,已进行改编脱敏处理
- 实际笔试可能出现题型变化,请以官方通知为准
🚀 春招备战指南
金三银四求职季即将到来!这里整理了最新字节跳动真题及解析,助你快速掌握笔试套路。建议重点突破以下题型:
- 动态规划/状态压缩
- 树形结构应用
- 字符串模式匹配
- 滑动窗口/双指针
(👇 下附最新笔试真题及详细解析 👇)
题目一:特殊数组计数
题目描述
小基定义一个数组为特殊数组:这个数组大小至少为 ,只由两种数字组成,且其中一种数字恰好出现一次。
例如:、
是特殊数组(长度为
,只有
和
组成且
恰好出现一次),而
、
、
都不是特殊数组。
小基有一个长度为 的数组
,他想知道这个数组有多少个子数组是特殊数组。
输入描述
第一行输入一个正整数 ,表示数组长度。
第二行输入 个正整数
,表示数组。
输出描述
输出一个整数表示答案。
样例1
输入:
6
1 1 4 5 1 4
输出:
1
说明:只有 是特殊数组。
样例2
输入:
4
2 2 3 2
输出:
3
题解
这道题目的关键在于如何高效地判断一个子数组是否为特殊数组。
对于每个子数组,需要满足以下条件:
- 长度至少为3
- 只包含两种不同的数字
- 其中一种数字恰好出现一次
可以使用双指针或滑动窗口的方法:
- 枚举左端点 i
- 对于每个左端点,枚举右端点 j
- 用哈希表统计当前区间内数字的出现次数
- 检查是否满足特殊数组的条件
时间复杂度:
参考代码
C++:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(n);
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
int ans = 0;
for(int i = 0; i < n-2; i++) {
unordered_map<int,int> cnt;
for(int j = i; j < n; j++) {
cnt[arr[j]]++;
if(j-i+1 >= 3 && cnt.size() == 2) {
for(auto [num,freq] : cnt) {
if(freq == 1) {
ans++;
break;
}
}
}
}
}
cout << ans << endl;
return 0;
}
Python:
n = int(input())
arr = list(map(int, input().split()))
ans = 0
for i in range(n-2):
cnt = {}
for j in range(i, n):
cnt[arr[j]] = cnt.get(arr[j], 0) + 1
if j-i+1 >= 3 and len(cnt) == 2:
for num, freq in cnt.items():
if freq == 1:
ans += 1
break
print(ans)
Java:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
}
int ans = 0;
for(int i = 0; i < n-2; i++) {
Map<Integer,Integer> cnt = new HashMap<>();
for(int j = i; j < n; j++) {
cnt.put(arr[j], cnt.getOrDefault(arr[j], 0) + 1);
if(j-i+1 >= 3 && cnt.size() == 2) {
for(Map.Entry<Integer,Integer> entry : cnt.entrySet()) {
if(entry.getValue() == 1) {
ans++;
break;
}
}
}
}
}
System.out.println(ans);
}
}
题目二:宝石与金币
题目描述
小柯在玩一款模拟经营游戏,这个游戏按时间排序有 个事件,每个事件可以在两种选项中选择一种:
(1) 消耗 颗宝石,获得
枚金币。 (2) 获得
颗宝石。
不过,宝石的数量是有上限的,在任何时刻,若小柯的宝石数量大于 ,则大于
部分的宝石直接消失。
在 个事件结束后,小柯每拥有
颗宝石,都可以将其换成
枚金币。
小柯初始时没有宝石,他想知道在最优策略下,他最多可以获得多少金币。
...(about 1000 more lines)...
题目三:循环彩带
题目描述
小兰有一条长度为 的彩带,彩带的每一个位置都有一个价值,用
表示。
小兰的彩带是由一条长度为 的彩带一直循环得到的,因此当
时,
。
小兰每次会从左往右或从右往左剪一段长度为 的彩带,他想知道每次剪下来的彩带的价值之和是多少。
输入描述
第一行输入两个正整数 ,表示彩带长度和剪彩带次数。
第二行输入 个正整数
,表示彩带每一个位置的价值。
接下来 行,每行先输入一个字符
,
为 'L' 说明从左往右剪,
为 'R' 说明从右往左剪,再输入一个正整数
。
输出描述
输出 行,每行输出一个整数表示答案。
样例1
输入:
6 3
1 1 3 5 1 4
L 2
L 3
R 12
输出:
2
10
32
说明:
- 第一次剪彩带,剪下来的是
,价值之和为
。
- 第二次剪彩带,剪下来的是
,价值之和为
。
- 第三次剪彩带,剪下来的是
,价值之和为
。
题解
这是一个循环数组的问题。关键点在于:
- 处理循环:对于长度为 n 的数组,第 i 个位置的实际值为 a[i % n]
- 处理前缀和:预处理前缀和数组可以快速计算区间和
- 处理大数:注意到循环节的长度为 n,只需要计算完整循环节的个数和剩余部分
时间复杂度:
参考代码
C++:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int n, q;
cin >> n >> q;
vector<int> arr(n);
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力