2021年秋招面试-字节跳动


字节跳动

我是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 证书被伪造了怎么办?

  • https是怎么防止DNS劫持的?

    不清楚。

    DNS劫持

    https可否有效应对dns劫持、http内容劫持

  • 减库存的时候,如果出现多减了一次库存怎么办?SQL怎么实现?

    回答了mysql的排他锁机制,SQL实现不清楚。

    回答了如果在服务器端,可以先加锁,追问如果是分布式情况怎么办?

    回答了zookeeper分布式锁,建立临时节点,追问api是什么?

    回答了create,参数大概有path、wather等,追问如果线程意外销毁了,zk怎么删除临时节点的?

    就不清楚了。

    ZK分布式锁,客户端宕机,应该是自动删除节点的。如果是线程,我觉得应该是捕捉异常后,主动释放连接。

  • 商城的支付功能是怎么实现的?

    支付宝的沙箱工具,jsp页面嵌入工程中,追问怎么保证支付的幂等性?

    回答了支付可以封装为一个信息,传入mq或者其他中间件,服务端消费成功失败都有回调接口。(也不知道对不对。。面试官就继续了)

  • Java为什么是可移植的?

    回答了JVM,追问JVM为什么可以跨平台呢?

    回答了,确实没有看底层的东西,但是我的理解是,各个系统提供了基本的接口,共JVM调用。

  • Java源码是什么时候转为字节码的?

    回答了,编译的时候,追问字节码可以直接执行吗?

    回答了,需要先编译为汇编语言和机器码,追问JIT的作用?

    回答了不太清楚。

    什么是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哦~继续加油!


文章作者: 小小千千
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小千千 !
评论
  目录