美文网首页
字节跳动实习面经分享

字节跳动实习面经分享

作者: 复旦猿 | 来源:发表于2020-02-05 13:08 被阅读0次

    参加的是data数据平台-大数据开发实习生的岗位面试,一面二面一起,全程视频面试。两位面试官态度都很好,当提的问题我答不上来时,面试官会耐心得做些引导,体验还是比较好的。

    一面

    1. 自我介绍
    2. 项目经历
      主要聊的是实验室做的一个数据流可视化分析平台,面试官问的问题很专业。简历上有三个项目,除了数据流可视化分析平台之外还有两个大学做的项目,面试官没怎么问,他让我自己讲下亮点,于是我就简单说了说放这两个项目的目的——证明下自己的工程能力和算法能力。

    这一部分和面试官聊的挺多,自认为发挥的还可以。

    1. JVM基础
      3.1 JVM内存结构
      3.2 类加载
      3.3 垃圾回收
      3.4 线程池ThreadPool

    我基本上把JVM准备的点都说了,过程比较顺利,对自己答得也比较满意。

    1. 做算法题
      去除链表中的所有重复元素,返回去除后的链表指针。使用哨兵节点,解决起来比较方便。
    public static ListNode deleteDuplicates3(ListNode head) {
            if (head == null || head.next == null) {
                return head;
            }
    
            ListNode dummyHead = new ListNode(-1);
            dummyHead.next = head;
            ListNode last = dummyHead;
            ListNode cur = head;
            while(cur != null && cur.next != null){
                if (cur.val == cur.next.val){
                    int val = cur.val;
                    while(cur != null && val == cur.val){  // 删除所有重复节点,仅保留只出现一次的节点。
                        cur = cur.next;
                        last.next = cur;
                    }
                } else {
                    last = cur;
                    cur = cur.next;
                }
            }
            return dummyHead.next;
        }
    

    一面结束后,面试官让我在线等会,马上进行二面。等了大概10多分钟,二面就开始了。

    二面

    1. 实验室研究课题介绍
      面试让我介绍下目前研究课题的内容,我就把手头在做任务的背景和方法介绍了一下。
    2. Java基础
      2.1 static关键字的理解
      2.2 Object类中方法介绍,hashCode()、equals()、wait()、notify()、toString()等

    2.1 回答还OK,2.2回答不是很好,因为也没怎么准备。

    1. 数据库
      2.1 MySQL索引理解
      2.2 B树与B+树的区别

    这一部分自我感觉还OK。

    1. 操作系统
      4.1 进程间通信的几种方式
      4.2 进程调度

    知识盲点,回答的一塌糊涂。

    1. 计算机网络
      5.1 tcp拥塞控制和流量控制

    回答的不是很满意。

    1. 做算法题
      6.1 输出二叉树最左下节点的值。解题思路:层次遍历,从右往左依次进队列,最后出队列的即为输出。
    /**
     * 寻找树中最左下角的值
     * @param root
     * @return
     */
    public int findBottomLeftValue(TreeNode root) {
      TreeNode cur = null;
      //队列
      Queue<TreeNode> queue = new LinkedList();
      //根节点入队
      queue.offer(root);
      while(!queue.isEmpty()){
        //出队一个元素
        cur = queue.poll();
        //按顺序入队其右孩子和左孩子
        if(cur.right != null)
          queue.offer(cur.right);  
        if(cur.left != null)
          queue.offer(cur.left);
      }
      //所有元素出队后拿到的就是最后一个节点,返回
      return cur.val;
    }
    

    6.2 第一个错误的版本。解题思路:二分法。

    public int firstBadVersion(int n) {
      int left = 1;
      int right = n;
      while (left <= right) {
        int mid = left + ((right - left) >> 1);
        if (!isBadVersion(mid)) {
            left = mid + 1;
        } else {
            if(mid == 0 || !isBadVersion(mid - 1)) return mid;  
            right = mid - 1;
        }
      }
      return -1;
    }
    

    两道算法写的比较顺利,可能是面试官太nice了,没出太难的算法题。

    1. 提问环节
      7.1 由于二面中2-5回答的不算很好,我就解释下,说我理论知识需要加强;不过平时工程能力还OK,上手速度快,善于解决问题,属于问题导向型。
      7.2 问了一下data数据平台部门使用的大数据框架,比如spark、flink,面试官说都会用到。

    二面结束后,我就问HR小姐姐什么时候会出结果。没想到HR很快回复了,说我二面通过了,并且预约了三面的时间。天呐,还有三面。

    三面

    本来HR小姐姐说,这是最后一面,我就理解为HR面,没想到啊,竟然还是技术面。弄了半天,HR小姐姐搞错了,三面还是技术面,过了之后才是HR面(最后一面)。整个面试过程持续2个小时,真的是太漫长了~不过面试官还是很nice的,会有提示和引导。
    不说废话了,进入正题。

    1. 自我介绍+项目介绍

    回答和一二面差不多。

    1. 算法题目
      2.1 MapReduce实现PV统计

    MapReduce代码不是很熟,面试官说让我讲讲思路就可以。
    问题延伸:1. 堆排序应该放到哪个阶段?——Reduce阶段;2. 建堆的时间复杂度——O(n)

    2.2 自己实现一个BlockingQueue。

    public class BlockingQueue {
        private final Queue<String> queue = new LinkedList<>();
        private Lock lock = new ReentrantLock();
        private Condition condition = lock.newCondition();
        public  String get() {
            try {
                lock.lock();
                while (queue.peek() == null) {
                    try {
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return queue.remove();
            } finally {
                lock.unlock();
            }
        }
        public void put(String request) {
            try {
                lock.lock();
                queue.offer(request);
                condition.signalAll();
            } finally {
                lock.unlock();
            }
        }
    }
    

    没回答好,不过在面试官不断提示下,还是有些思路——使用wait和notify实现。问题延伸:notify和notifyAll有什么区别。

    2.3 DAG的拓扑排序

    因为这一部分和项目介绍相关,所以比较熟。思路就是统计一下每个节点的入度,输出所有入度为0的节点。但面试官说能不能不先遍历图,直接输出。面试官真的很耐心,提示我参考二叉树的后序遍历——先子节点然后父节点,注意使用栈,和记录访问日志。

    public class DAG {
        class Node{
            String val;
            List<Node> children;
            public Node(String val){
                this.val = val;
                this.children = new ArrayList<>();
            }
    
            public void addChild(Node node){
                this.children.add(node);
            }
        }
    
        private Stack<String> stack;
        private Set<String> visited;
    
        public DAG(){
            stack = new Stack<>();
            visited = new HashSet<>();
        }
    
        public void core(Node root){
            if (root == null || visited.contains(root.val)){
                return;
            }
            for (int i = 0; i < root.children.size(); i++){
                core(root.children.get(i));
            }
            if (!visited.contains(root.val)){
                stack.push(root.val);
                visited.add(root.val);
            }
        }
    
        public String topoTraverse(Node root){
            core(root);
            StringBuilder stringBuilder = new StringBuilder();
            while (!stack.isEmpty()){
                stringBuilder.append(stack.pop());
            }
            return stringBuilder.toString();
        }
    
        public static void main(String[] args) {
            DAG dag = new DAG();
            Node a = dag.new Node("A");
            Node b = dag.new Node("B");
            Node c = dag.new Node("C");
            Node d = dag.new Node("D");
            Node e = dag.new Node("E");
            Node f = dag.new Node("F");
            a.addChild(b);
            a.addChild(c);
            b.addChild(d);
            c.addChild(d);
            d.addChild(e);
            e.addChild(f);
            a.addChild(f);
    
            System.out.println(dag.topoTraverse(a));
        }
    }
    
    1. 爱好
    2. 提问环节

    虽然感觉自己发挥不咋的,但还是过了。可能是面试官看中了我的潜力~~~

    HR面

    顺利通过~

    内推内推,很认真的内推,免笔试的那种哦

    号外!号外! 字节跳动研发提前批开始啦~大量坑位,欢迎大家来占哦~网申时间6月16-7月16日,机会多多,快快投递简历吧,内推码:GHT9VNC
    感兴趣的同学可以留言交流~

    image.png

    相关文章

      网友评论

          本文标题:字节跳动实习面经分享

          本文链接:https://www.haomeiwen.com/subject/jrocxhtx.html