字节跳动
我是2021年7月8日通过hr投递的,产研-国际化电商的后端开发岗。
一面
2021年7月12晚上问的字节hr最近有没有面试,然后就约到了第二天上午(2021-07-13)10:30进行。
时间大概大概1个小时20分钟左右~
自我介绍
skip。。
知识点
进程和线程的区别
Java线程池?如何自己设计一个简单的线程池?提供什么接口?线程池的抛弃策略?
关于简单的线程池,我说的是一个构成方法传入固定大小的线程数,队列可以存放多余的任务,剩下线程之间变量的共享注意同步问题。
提供的接口,一个是是否已经满,第二个是get线程池方法
抛弃策略也记得不是很清楚,答了一个直接抛弃。下面在巩固一下。
·ThreadPoolExecutor.AbortPolicy (默认饱和策略) 抛出RejectedExecutionException异常拒绝新任务 · ThreadPoolExecutor.CallerRunsPolicy 调用执行自己的线程运行任务。不丢弃任何一个任务请求。 · ThreadPoolExecutor.DiscardPolicy 不处理新任务,直接丢弃 · ThreadPoolExecutor.DiscardOldestPolicy
Redis的数据结构?如何运用在项目中的
Redis在实际项目中的作用
Redis的持久化机制?RDB和AOF的不同?自己项目中怎么使用的?
很尴尬,时间久了忘记了Redis文件中已经配置过了RDB,这个要注意一下~
Redis的zset一般怎么用?底层数据结构是什么?
底层数据结构忘记了….我模糊记得是跳跃表?下面再巩固一下。
有两个:跳跃表和压缩列表 REDIS_ENCODING_ZIPLIST、REDIS_ENCODING_SKIPLIST
url访问的过程
tcp属于哪一层协议?tcp的建立连接和释放连接以及原因?
tcp和udp的对比?tcp为什么可靠?
智力题
题目:64匹马,只有8个赛道,怎么找到最快的4匹马?
之前有看到过类似的解决方法,但是时间有点久远,只答出了大致思路,具体结果没给出来,很遗憾。
解法已经总结在算法word中~
算法题
题目
1—n中,找到所有连续的序列,使其和为n。
解答
这题我用的是滑动窗口法,面试官问了时间复杂度(在o(n)和o(n^2)中不定,最后分析为o(n),即便有两个while(好像是对的吧))。
小插曲:list保存结果时,需要删除left的数据,remove默认删除是下标删除,这里不好弄, 报了个错,后来结合题目环境,无重复改用Set。
import java.util.*; public class Main { public static void main(String[] args) { //Scanner in = new Scanner(System.in); //int a = in.nextInt(); //System.out.println(a); System.out.println(fun(9)); } public static List<Set<Integer>> fun(int n){ // 1---n int left = 1, right = 1; int sum = 0; List<Set<Integer>> res = new ArrayList(); Set<Integer> set = new HashSet(); while(right <= n){ sum += right; set.add(right); //int index = 0; while(sum > n){ sum -= left; set.remove(left); left++; } if(sum == n){ res.add(new HashSet(set)); } right++; } return res; } }
二面
2021年7月13晚上问了hr,一面结果什么时候出来,第二天早上(2021年7月14日)收到hr通知进行二面,时间选择了当天晚上20:00。
时间大概大概40分钟左右~
自我介绍
Skip…
项目
电商网页的注册时,怎么处理密码的?
密码是明文传递过来的吗?怎么加密?
回答了可以前端通过js进行加密,或者用https。
https是怎么进行加密的?证书如果被仿造怎么办?
回答了https加密过程,不清楚证书伪造。
https是怎么防止DNS劫持的?
不清楚。
减库存的时候,如果出现多减了一次库存怎么办?SQL怎么实现?
回答了mysql的排他锁机制,SQL实现不清楚。
回答了如果在服务器端,可以先加锁,追问如果是分布式情况怎么办?
回答了zookeeper分布式锁,建立临时节点,追问api是什么?
回答了create,参数大概有path、wather等,追问如果线程意外销毁了,zk怎么删除临时节点的?
就不清楚了。
ZK分布式锁,客户端宕机,应该是自动删除节点的。如果是线程,我觉得应该是捕捉异常后,主动释放连接。
商城的支付功能是怎么实现的?
支付宝的沙箱工具,jsp页面嵌入工程中,追问怎么保证支付的幂等性?
回答了支付可以封装为一个信息,传入mq或者其他中间件,服务端消费成功失败都有回调接口。(也不知道对不对。。面试官就继续了)
Java为什么是可移植的?
回答了JVM,追问JVM为什么可以跨平台呢?
回答了,确实没有看底层的东西,但是我的理解是,各个系统提供了基本的接口,共JVM调用。
Java源码是什么时候转为字节码的?
回答了,编译的时候,追问字节码可以直接执行吗?
回答了,需要先编译为汇编语言和机器码,追问JIT的作用?
回答了不太清楚。
算法
题目
input: [1, 3, 9, 10, 30, 11, 10] 先递增,后递减
output: 6
空间复杂度O(1)
解答
用的双指针法,简要答了思路,然后开始写代码。
import java.util.*; public class Main { public static void main(String[] args) { //Scanner in = new Scanner(System.in); //int a = in.nextInt(); //System.out.println(a); int[] arr = new int[]{1, 3, 9, 10, 30, 11, 10}; System.out.println(fun(arr)); } public static int fun(int[] nums){ int left = 0, right = nums.length - 1; int size = nums.length; while(left <= right){ while(nums[left] < nums[right]){ left++; } while(nums[right] < nums[left]){ right--; } if(nums[left] == nums[right]){ int num = nums[left]; while(left <= right && nums[left] == num){ left++; size--; } while(left <= right && nums[right] == num){ right--; size--; } size++; } } return size; } }
三面
2021年7月15日早上收到hr通知进行三面,时间选择了第二天(2021年7月16日)晚上18:00。
时间大概大概1小时左右~
自我介绍
Skip…
知识点
Tcp/Ip协议,释放连接的过程?为什么需要第四次?
进程调度算法知道哪些?
知道有哪些排序算法?归并排序的时间复杂度和空间复杂度?稳定性了解吗?归并排序稳定吗?快速排序稳定吗?
回答了,简单的排序有冒泡、插入、选择,复杂的有归并、快排、堆排。
回答了,归并时间复杂度为O(nlogn),空间根据我使用的数组方法归并,为O(n)
回答了,稳定性是排序前后,相等值的位置关系有没有变化
回答了,归并是稳定的,快排是不稳定的。
项目
介绍一下“动态增加的姿势识别”项目
对微服务框架的认识?
回答了,从单体架构-垂直架构-RPC架构-微服务的演变,微服务主要区别在于对集群服务的管理。
电商项目里面Redis是干什么用的?如果是1000万数量级这种结构还适用吗?如果要下架一个商品,结构有什么缺点,需要做什么改进?
回答了购物车功能,和结构设计。
回答了1000万级时,可以进行Redis的集群处理,通过路由算法,例如可以放置10台机器,每个机器里面只放100万数据即可。key就直接是openId,value可以是map,map的key是itemId,map的value是商品数量。
回答了如果要下架商品,这个结构最大的缺点就是需要遍历所有key,并遍历value的Map进行删除。可以结合懒删除,并在每台Redis中,增加以商品为key,购物的openId列表list为value。下架时,在Redis中先将对应商品key的记录删除,并对该商品进行标记(可能形成一个标记列表),当用户访问购物车时,用openId访问到map,在遍历map到key时,若key在标记列表中,则跳过或者删除即可。
算法
题目
删除一个已排序(升序)的单向链表中的重复元素(一旦元素重复,删除全部该重复元素,例如1->2->2->3,删除后结果1->3),并返回修正后的的链表的链表头。(编程语言不限,20分钟内完,尽量少使用额外存储空间)
解答
就是leetcode原题嘛,只是需要自己打印用例,设计链表类。
import java.util.*; class ListNode { int value; ListNode next; public ListNode(){}; public ListNode(int value){ this.value = value; } } public class Main { public static void main(String[] args) { //Scanner in = new Scanner(System.in); //int a = in.nextInt(); //System.out.println(a); ListNode head = new ListNode(2); head.next = new ListNode(2); head.next.next = new ListNode(3); head.next.next.next = new ListNode(3); head.next.next.next.next = null; ListNode res = fun(head); while(res != null){ System.out.print(res.value + " "); res = res.next; } } public static ListNode fun(ListNode head){ ListNode dummy = new ListNode(); dummy.next = head; ListNode pre = dummy; ListNode cur = head; while(pre.next != null){ while(cur.next != null && pre.next.value == cur.next.value){ cur = cur.next; } if(pre.next == cur){ pre = cur; cur = cur.next; }else { pre.next = cur.next; } } return dummy.next; } }
智力题
- 题目:餐桌上两个盘子,一个盘子7个苹果,一个盘子10个苹果,我每次按照下面条件拿苹果:1 每次拿至少1个苹果 2 每次只能从一个盘子拿。两个人交替拿苹果,如果是我先手拿,那么我最后是,必败?必胜?还是可能败可能胜。假设对手非常对认真。思考15分钟作答。
- 解答:根据我先手拿是否剩苹果,和剩几个苹果,举例分析之后,答了“必败”(也不知道对不对)
设计题
- 题目:几万字的博客,在发布的过程中警告有敏感词汇,问怎么排查才能使得博客顺利发布?
- 解答
- 常规情况:1 根据自己对博客的熟悉程度,将可能出现的敏感词定位在大致范围 2 根据熟悉的敏感词进行搜索判定
- 技术手段:调整博客的编码和博客平台编码不一致
- 非技术手段:分治思想,先将一部分删除,尝试发布,根据发布结果缩小查找范围。(这个应该是面试官想听到的)
反问
问了我是java编程,进去之后大概是怎样一个形式学习go和适应团队~面试官也非常耐心的解答了~
offer
2021-07-21hr打电话通知通过终面,约在17:00谈offer。
时间大概几分钟,说明了现在的流程,先发意向书offer,薪资制度还未出来,在10月份左右在具体谈薪资~
开心~🎉撒花~这是正式校招的第一个offer哦~继续加油!