字節跳動真實面試編程題與經驗分享:后台研發工程師(直播)-抖音/火山職位


概述

整體來說,字節跳動的面試體驗還是很好的,雖然本人只進行了一面,然后就涼了,但是起碼HR會通知你結果,不用忐忑不安的等待。(指上一篇文章的京東,三面都面完了,然后就永久失聯了,用兩個星期從希望變成失望,又用了一個星期才平復了心態。)

現在把面試經驗總結一下。

PS:本人Java開發2年經驗,面的是Java開發崗位。

 


 

 

過程

1.首先本人於2020年11月15日通過拉勾APP投了一個字節跳動崗位。

2.2020年11月16日,字節跳動就打來電話了,HR加了個微信,然后發了一個日歷圖片,讓本人約一個面試時間;本人約了11月22日14:30的面試,那天是周日。

可以選擇周六日面試是比較好的。(當然也能選平時,下午2:00-7:00&晚上7:30-9:30兩個時間段可以)

3.之后HR會發來郵件,郵件中包含約好的面試時間,以及視頻面試鏈接;然后本人就開始准備面試。

PS:拉勾APP里的簡歷一直保持着“投遞成功”的狀態,看來字節跳動不修改拉勾中簡歷的狀態。

 


 

 

2020.11.22,面試開始。視頻面試網站是有代碼框的,面試官會讓你寫代碼。

問題大概如下(有遺忘):

1.自我介紹。

2.簡要介紹下你做過的項目。

3.一些項目細節問題。

4.spring與springboot的區別。

5.寫一個sql,查詢課程名、最高分、最低分、平均分。

表:

 

 

 

sql參考答案:

select s.course,MAX(s.score),MIN(s.score),AVG(s.score) from scoreTable s group by s.course

截圖:

 

 

 

6.寫一個大數相乘的方法,傳入兩個string

參考答案(Java):

import java.util.Scanner;

public class t2 {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入第一個數:");
        String str1 = sc.next();
        System.out.println("請輸入第二個數:");
        String str2 = sc.next();
        largenumberOperationMultiply bn = new largenumberOperationMultiply();
        //創建類largenumberOperationMultiply的對象bn
        String output = bn.multiply(str1,str2);
        //bn對象調用multiply方法對str1和str2進行操作
        System.out.println(str1+"與"+str2+"的積為="+output);
    }
            
    //創建類largenumberOperationMultiply
    public static class largenumberOperationMultiply {

        //定義方法multiply的功能
        public String multiply(String str1,String str2){
            int[] num1 = new int[str1.length()];
            int[] num2 = new int[str2.length()];
            int[] result = new int[str1.length() + str2.length()];

            //將兩個字符串轉成整型數組,順序轉換,數組下標越小,數字對應的位數越高
            for (int i = 0;i < str1.length(); i++){
                num1[i] = Integer.parseInt(str1.substring(i,i+1));
            }
            for (int i = 0;i < str2.length(); i++){
                num2[i] = Integer.parseInt(str2.substring(i,i+1));
            }

            //兩大數相乘
            for (int a = 0;a < str1.length(); a++){
                for (int b = 0;b < str2.length(); b++){
                    result[a+b] += num1[a]*num2[b];
                }
            }

            ////判斷是否需要進位,滿10進1,因為存儲順序與位數高低相反,所以采用逆序進位
            int temp;
            for (int k = result.length-1; k > 0; k--){
                temp=result[k]/10;  //數組下標大的向數組下標小的進位
                result[k-1] += temp;
                result[k] = result[k]%10;
            }

            //將結果數組逆序轉化為字符串
            String resultstr = "";
            for (int i = 0; i < result.length-1; i++){
                resultstr += "" + result[i];
            }

            return resultstr;
        }
    }
}

 

7.寫一個二叉樹層次遍歷的方法:

參考答案(Java):

import java.util.LinkedList;
import java.util.Scanner;

public class t2 {
    public static class TreeNode {
        public int data;
        public TreeNode leftChild;
        public TreeNode rightChild;

        public TreeNode(int data){
            this.data = data;
        }

    }
    /**
     * 構建二叉樹,先建左樹后建右樹
     * @param list   輸入序列
     * @return
     */
    public static TreeNode createBinaryTree(LinkedList<Integer> list){
        TreeNode node = null;
        if(list == null || list.isEmpty()){
            return null;
        }
        Integer data = list.removeFirst();
        if(data!=null){
            node = new TreeNode(data);
            node.leftChild = createBinaryTree(list);
            node.rightChild = createBinaryTree(list);
        }
        return node;
    }

    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        //開始建二叉樹,null是必要條件,大家可以打斷點分析
list.add(
1); list.add(2); list.add(4); list.add(null); list.add(null); list.add(5); list.add(null); list.add(null); list.add(3); list.add(6); list.add(null); list.add(null); list.add(7); //7是最后一個元素,7的左右子樹為null,現在省略不寫即可 TreeNode binaryTree = createBinaryTree(list); //二叉樹形狀 /** * 1 * 2 3 * 4 5 6 7 */ levelOrder(binaryTree); } //層次遍歷二叉樹,輸出 1 2 3 4 5 6 7 public static void levelOrder(TreeNode root){ LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()){ root = queue.pop(); System.out.print(root.data+" "); if(root.leftChild!=null) queue.add(root.leftChild); if(root.rightChild!=null) queue.add(root.rightChild); } } }

 

再附一個四種二叉樹遍歷的網址,寫的挺好的(就是初始化二叉樹時說的不詳細):

https://www.cnblogs.com/du001011/p/11229170.html

以及二叉樹前中后序遍歷代碼(Java),這些代碼復制到上面的代碼中直接就能使用,其中舉例的樹的樣式也同上:

          1
2 3
4 5 6 7
//前序遍歷,根-左-右,1 2 4 5 3 6 7 
    public static void preOrderTraveral(TreeNode node){
        if(node == null){
            return;
        }
        System.out.print(node.data+" ");
        preOrderTraveral(node.leftChild);
        preOrderTraveral(node.rightChild);
    }
//中序遍歷,左-根-右,4 2 5 1 6 3 7 
    public static void inOrderTraveral(TreeNode node){
        if(node == null){
            return;
        }
        inOrderTraveral(node.leftChild);
        System.out.print(node.data+" ");
        inOrderTraveral(node.rightChild);
    }
//后續遍歷,左-右-根,4 5 2 6 7 3 1
    public static void postOrderTraveral(TreeNode node){
        if(node == null){
            return;
        }
        postOrderTraveral(node.leftChild);
        postOrderTraveral(node.rightChild);
        System.out.print(node.data+" ");
    }

 

8.會用JVM調優嗎?

9.其它問題,記不清了,可能是些小問題吧,如果是明顯不會的問題我應該會記下來的。(但是現在查筆記,發現沒記錄下什么問題來,只記錄了編程大題)

 


 

 

后記

一面主要是面試編程題,甚至HR微信之前就提醒說可以刷LeetCode了。

不過實際上這2道編程題與LeetCode關系不大。(盡管還是太菜,寫一半就寫不下去了)

由於本人之前沒有刷過LeetCode,聽到要考算法題,就知道基本涼了,短期內又刷不完,所以這次已經做好涼的准備了。

至於JVM調優,目前工作中沒有機會用,也不知道怎么學……

果然,2020.11.22面試完后,2020.11.24,HR微信上通知本人,一面涼了。(HR微信提過,字節跳動有三次技術面,一次HR面,共四面。)

主要就是因為那2道編程題不會吧,也不能算很難,但是平時沒有接觸過,所以當時不會。

還好,這次做好涼的准備了,繼續學習,爭取下次成功。

PS:字節跳動可以約周六日面試,就算涼了HR也會通知,這兩點挺好的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM