字節跳動後端面試

本人一年php開發經驗,面試字節跳動後端開發崗。

面試過程:

面試官沒有要求自我介紹,自己看我的簡歷問了我之前的工作和實習的經歷,開始就我的實際項目提問。

多線程寫文件:我在工作項目中使用單例模式實現,用單例模式中唯一的實例控制寫文件的操作,每次只有一個線程可以寫文件。面試官提問如果有同時需要讀寫的情況怎麼做?答使用一個全局變量記錄當前正在讀文件的線程個數,寫文件的操作內容在一個臨時文件中保存,如果當前沒有線程在讀文件則把臨時文件中的修改更新到主文件中。

java中的讀寫鎖的實現:一年沒有用java所以記不太清,面試官提示有讀鎖和寫鎖,兩個都是排它鎖,之後讓我自己設計怎麼實現讀寫鎖。線程寫文件時,競爭寫鎖,如果成功獲取到寫鎖則進行寫文件操作,寫完釋放寫鎖;讀文件時先獲取寫鎖(讀文件時不允許再有寫的操作),獲取成功後再獲取讀鎖,之後記錄當前讀線程的個數++,釋放讀鎖,線程讀取文件,線程讀取結束後獲取讀鎖,當前讀線程的個數--,釋放讀鎖;判斷是否還有線程在讀文件,如果沒有則釋放寫鎖。這裏需要強調的是,讀鎖不是爲了鎖文件,而是爲了鎖當前讀線程的數量。

C++內存對齊問題

struct{
char a;
short b;
int c;
char d;
char e;
}

問這個struct佔用了多少字節?12字節。如果把short改成char,有沒有減少佔用字節的辦法?答把d和e寫到int前面,佔用8字節。

手寫代碼:二叉樹先序遍歷(面試官說他不瞭解php,讓我用其他語言寫,我先寫了遞歸的實現,之後要求用非遞歸實現)

遞歸實現:

public void preOrder(TreeNode root)
{
    if(root == null)
    {
        return ;
    }
    System.out.print(root.val+" ");
    preOrder(root.left);
    preOrder(root.right);
}

非遞歸實現:

public void preOrder(TreeNode root)
{
    if(root == null)
    {
        System.out.println("empty");
    }
    Stack<TreeNode> stack = new Stack<>();
    while(!stack.empty() || root != null)
    {
        if(root != null)
        {
            System.out.print(root.val + " ");
            stack.push(root);
            root = root.left;
        }else{
            TreeNode node = stack.pop();
            root = node.right;
        }
    }
}

面試官說這個雖然實現了非遞歸的先序遍歷,但是棧非空時對於葉節點或者只有一個子樹的節點,都是會進入循環判斷它的右子節點,屬於多餘的操作,非遞歸方式優化的思路:從根節點開始,先根節點入棧,然後出棧並輸出根節點的值,再根節點的右子節點入棧,左子節點入棧;再執行出棧操作,對出棧的節點先右子節點入棧,後左子節點入棧,循環至棧爲空。

之後面試官問我有什麼想問他的,我很蠢的問他這個崗位是什麼語言開發,他說golang,我補了一句不是php啊,之後面試官說他們組沒有php開發,問我有沒有學習過golang,我說看過慕課網的課程,用golang在牛課網刷過題,他說刷題不能真正領悟到這門語言。之後我感覺要涼了。。。。

插一句閒話,字節跳動的保潔阿姨好可愛,我在等面試官的時候有些緊張一直搓手,她說你不要緊張啊笑一笑,多想開心的事情,緊張了發揮不好的,還給我送了礦泉水,真棒。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章