共计 3891 个字符,预计需要花费 10 分钟才能阅读完成。
目录
- 前言
- 三轮面经
- 对于字节
- 彩蛋
前言
七月播种了字节的意向书,今日无暇把面经整理出来分享给大家,也借此 把好运分享给大家。
简略介绍下集体状况:
面试前:剑指 offer 刷完,Leetcode 大略 70 道。操作系统温习结束,数据库不会,计网不会。
起初:一背后一周学了数据库,三背后三天学了计网。两周工夫陆续刷了 80 道 Leetcode。
心愿这篇文章能对大家有所帮忙,祝各位 offer 多多!
三轮面经
自己无实习,故而没有被问到对于我的项目的问题。
问题形成:手撕代码、基础知识、场景题。
「基础知识」都是固定答案,因而本篇中只分享题目,不分享答案。
一面
- 手撕代码
easy 题:中文字符串转成数字。例:“五百三十万六千零三”-> 5306003。束缚:输出金额在一亿以内。要求:做肯定的容错解决,bug free。
这题比较简单,办法大家应该都能想到。只是要求 bug free 和容错解决,因而写代码的时候要思考欠缺点。比如说输出异样的状况(字符串是否非法,“五五百”这种就不非法,“3 百五”也不非法)。
- 手撕代码
leetcode medium 原题:判断字符串是否满足斐波那契规定,如:“199100199”。因为 1 + 99 = 100,99 + 100 = 199。
这题老汪是在面试官的疏导下才一步一步想到最优解的。(吹爆面试体验,面试官很急躁的在疏导,nice!)
这题的关键点就在于如何找到结尾两个数字 n1, n2。找到了这两个数字,前面就能够用 n = n1 + n2 的规定通过一次遍从来判断是否合乎斐波那契规定。找结尾俩数字只能暴搜了,代码如下:
public boolean solve(String str){if(str == null) return false;
int n = str.length();
for(int i = 1; i < n; i++){int n1 = Integer.parseInt(str.substring(0, i)); // 取得第一个数
for(int j = i + 1; j < n; j++){int n2 = Integer.parseInt(str.substring(i, j)); // 取得第二个数
if(judege(str, n1, n2, start)) return true;// 判断是否合乎规定
}
}
return false;
}
// 给定 n1, n2,判断字符串是否合乎斐波那契规定
boolean judge(String str, int n1, int n2, int start){int n = str.length();
for(int i = start; i < n;){
int n3 = n1 + n2;
int len = (n3 + "").length();
if(start + len > n || n3 != Integer.parseInt(str.substring(i, i + len))) return false; // 下标超了, 或者后一个数字不等于 n3
i += len;
}
return true;
}
工夫复杂度:O(n^3),找到结尾两个数字须要 O(n^2),判断字符串是否合乎规定须要 O(n)。
这题能够剪枝来略微升高一些工夫耗费,大家能够自行优化。
- 手撕代码
10 亿个无序整数找出中位数。
这题老汪也是在面试官的疏导下才一步步想到最优解的。(再次吹爆面试体验)
因为是 10 亿个整数,因而无奈在内存中解决。也就是说要采纳适合的外排序算法。
这里能够应用桶排序,应用 n 个区间平均的桶,遍历一遍整数,将它们存入对应区间的桶中,并统计桶中数字个数。这样就能够找到中位数所在的桶,如果桶中数字还是很多,再进行桶排序,否则进内存中排序即可。
二面
- 事务的 ACID 个性
- Innodb 应用的索引构造
- b+ tree 的长处,为什么要用它
- 给定复合索引 (a, b, c),查问语句中用 where a = 1 and c = 1,索引是否会生效?(最左前缀匹配的相干常识)
- 一条 SQL 语句的执行流程(不会)
- 过程和线程的区别
- 并发和并行的区别
- 过程调度的策略
- 死锁产生的起因
- 手撕代码
- leetcode 原题 41(不会,换了一题)
给你一个未排序的整数数组,请你找出其中没有呈现的最小的正整数。
思路:要找最小的正整数,数组中有 n 个数字,那么缺失的最小正整数肯定在 [1, n + 1] 内。
因而能够利用数组自身做哈希,遍历一遍数组,将 [1, n] 内的数字 i
放到对应下标 i - 1
上。
再遍历一遍数组,第一个 nums[i] != i + 1
的数字 i + 1 即为缺失的最小正整数。
代码如下:
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i = 0; i < n; i++){while(nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]){//(0, n] 的数字放到对应下标上
int temp = nums[i] - 1;
nums[i] = nums[temp];
nums[temp] = temp + 1;
}
}
int i = 0;
for(; i < n && nums[i] == i + 1; i++); // 找到第一个未呈现的正整数
return i + 1;
}
工夫复杂度:O(n),尽管有 while 循环,但每个数字最多被替换一次即可到对应下标上。
- leetcode 原题 3
给定一个字符串,请你找出其中不含有反复字符的 最长子串 的长度。
思路:很经典的一道题了,滑动窗口即可解决。
代码如下:
public int lengthOfLongestSubstring(String s) {if(s == null) return 0;
Map<Character, Integer> map = new HashMap<>();
int start = 0, ans = 0;
for(int i = 0; i < s.length(); i++){char c = s.charAt(i);
if(map.getOrDefault(c, -1) >= start) start = map.get(c) + 1;
map.put(c, i);
ans = Math.max(ans, i - start + 1);
}
return ans;
}
三面
- 手撕代码
算法题:二维数组,按行递增,按列递增,问是否能找到某个数字(剑指 offer 原题)
思路:利用递增的个性,从最左下角开始遍历(该列最大值,该行最小值)。和指标数字比拟:
< 指标数
,阐明这一列都 < 指标数,因而列下标 + 1
> 指标数
,阐明这一行都 > 指标数,因而行下标 – 1
这样,每次比拟都能够排除一行 / 一列。
代码如下:
public boolean canFind(int[][] matrix, int target){if(matrix == null || matrix.length == 0) return false;
int rows = matrix.length, cols = matrix[0].length;
int row = rows - 1, col = 0;
while(row >= 0 && col < cols){if(matrix[row][col] == target) return true;
if(matrix[row][col] > target) row--;
else col++;
}
return false;
}
- 手撕代码
算法题:2 1 的小矩形填充斥 2 n 的大矩形有多少种计划?
思路:挺简略的动静布局题
代码如下:
public int nums(int n){if(n < 0) return 0;
int[] dp = new int[Math.max(n, 2)];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i < n; i++) dp[i] = dp[i - 2] + dp[i - 1];
return dp[n];
}
这里空间复杂度是 O(n),也能够通过 状压 dp
将空间复杂度降到 O(1)。
- 场景设计
1000 亿个无符号整数,找最大的 100 个。内存不够的状况下用什么计划?内存短缺的状况下呢?partition 的计划不稳固,有什么稳固的办法吗?
内存不够堆排序,内存够用计数排序。
- https 如何加密的
- os 中的 pagefault(缺页中断)
- mysql 中的底层索引构造?为什么用这个构造
- hashmap 是线程平安的吗?想要线程平安怎么办?
- 场景设计
大文件的断点续传
这题网上也有很多计划。老汪是参照 tcp 的滑动窗口和重传机制来答复的。
把大文件分块并打上编号,接收端对块进行有序确认,如果有某块没收到,就告知发送端让其重发。
发送端记录最初一次发送的编号,断点续传时从这个编号开始传。
因为负载平衡,续传的时候要确定从哪个服务器拿的,这个能够让接收端记录发送端的标识。
对于字节
- 工作强度:大小周,10 10 5.5。不强制加班,做完就能够走,但工作量个别要加班实现。因人而异,也有摸鱼的。
- 福利:三餐全包,下午茶,房补 1500,收费健身房(基本上工作一年后都会吃胖,hhh)
- 气氛:扁平化治理,网传风评都挺不错的。
- 新人造就:mentor 制,一对一率领新人相熟。不过和老牌 BAT 相比,文档不够欠缺,新人造就流程还是有些欠缺的。
- 字节校招的考查重点:后端的话,基本上是要转 go/python 的,所以不怎么考查语言。
次要考查「操作系统」、「数据库原理」、「计网」和「手撕代码」,字节是非常重视手撕的,这个肯定要好好筹备。当然我的项目做得好的同学,也是有加分的。
老汪点评:工作强度大,面对的挑战多,薪酬也给力。适宜能力强、抗压能力强的同学,扛得住压成长会很快。不过对新人的确有点考验,因人而异吧。
彩蛋
- 尽管字节的手撕代码比拟难,但题库是无限的,多刷面经中的算法题,会有很大概率碰上原题。
- 有三面挂了的,想投上海 data 部门的,老汪能够帮忙分割 HR 直捞。
- 祝 点赞 的各位小伙伴 offer 多多。没点赞的小伙伴嘛,也 offer 多多吧。嘻嘻~
- 据说发一句“所有都会好起来的!”,就 真的所有都好起来了!