关于java:面经你可能需要的字节跳动三轮面经

41次阅读

共计 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 个区间平均的桶,遍历一遍整数,将它们存入对应区间的桶中,并统计桶中数字个数。这样就能够找到中位数所在的桶,如果桶中数字还是很多,再进行桶排序,否则进内存中排序即可。

二面

  1. 事务的 ACID 个性
  2. Innodb 应用的索引构造
  3. b+ tree 的长处,为什么要用它
  4. 给定复合索引 (a, b, c),查问语句中用 where a = 1 and c = 1,索引是否会生效?(最左前缀匹配的相干常识)
  5. 一条 SQL 语句的执行流程(不会)
  6. 过程和线程的区别
  7. 并发和并行的区别
  8. 过程调度的策略
  9. 死锁产生的起因
  10. 手撕代码
  • 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 的计划不稳固,有什么稳固的办法吗?

内存不够堆排序,内存够用计数排序。

  1. https 如何加密的
  2. os 中的 pagefault(缺页中断)
  3. mysql 中的底层索引构造?为什么用这个构造
  4. hashmap 是线程平安的吗?想要线程平安怎么办?
  5. 场景设计

大文件的断点续传

这题网上也有很多计划。老汪是参照 tcp 的滑动窗口和重传机制来答复的。

把大文件分块并打上编号,接收端对块进行有序确认,如果有某块没收到,就告知发送端让其重发。

发送端记录最初一次发送的编号,断点续传时从这个编号开始传。

因为负载平衡,续传的时候要确定从哪个服务器拿的,这个能够让接收端记录发送端的标识。

对于字节

  1. 工作强度:大小周,10 10 5.5。不强制加班,做完就能够走,但工作量个别要加班实现。因人而异,也有摸鱼的。
  2. 福利:三餐全包,下午茶,房补 1500,收费健身房(基本上工作一年后都会吃胖,hhh)
  3. 气氛:扁平化治理,网传风评都挺不错的。
  4. 新人造就:mentor 制,一对一率领新人相熟。不过和老牌 BAT 相比,文档不够欠缺,新人造就流程还是有些欠缺的。
  5. 字节校招的考查重点:后端的话,基本上是要转 go/python 的,所以不怎么考查语言。

次要考查「操作系统」、「数据库原理」、「计网」和「手撕代码」,字节是非常重视手撕的,这个肯定要好好筹备。当然我的项目做得好的同学,也是有加分的。

老汪点评:工作强度大,面对的挑战多,薪酬也给力。适宜能力强、抗压能力强的同学,扛得住压成长会很快。不过对新人的确有点考验,因人而异吧。

彩蛋

  1. 尽管字节的手撕代码比拟难,但题库是无限的,多刷面经中的算法题,会有很大概率碰上原题。
  2. 有三面挂了的,想投上海 data 部门的,老汪能够帮忙分割 HR 直捞。
  3. 点赞 的各位小伙伴 offer 多多。没点赞的小伙伴嘛,也 offer 多多吧。嘻嘻~
  4. 据说发一句“所有都会好起来的!”,就 真的所有都好起来了!

正文完
 0