快手算法岗日常实习面试经验
快手算法崗日常實習面試經驗
時間:2019.4.3 10:00 地點:北京市海淀區上地西路6號(快手總部)-E座
這次快手的面試一共兩面,每一場面試都是先針對簡歷問問題然后手寫一道算法題。由于我簡歷里科研的內容比較多,所以兩位面試官都問了我關于我的一作在投論文的問題。由于是現場面試,所以代碼是用筆寫在草稿紙上然后面試官肉眼判題的。下面的面試流程就不敘述討論論文的部分,只敘述手寫算法題的部分。
一面
【二叉樹形態變換】給定一個用中序遍歷定義的二叉搜索樹,用in-place的算法把二叉樹變成有序鏈表,其中鏈表用左子樹為null的二叉樹等價表示。下面是例子,其中N表示null:
這道題類似LeetCode上的Flatten Binary Tree to Linked List,只不過LeetCode上原二叉搜索樹是用先序遍歷定義的。大致思路是一樣的,都是在先序遍歷或中序遍歷的過程中加入節點指針的重定向操作,注意一下左子樹或右子樹為空的情形即可。更加詳細的解題報告見我的博客LeetCode 114. Flatten Binary Tree to Linked List(二叉樹)。LeetCode上那題的代碼如下,可供參考:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ class Solution {private TreeNode preorder(TreeNode root){if (root == null){return null;}TreeNode tmp = root.right, left_tail = preorder(root.left);if (root.left != null){root.right = root.left;}root.left = null;if (left_tail != null){left_tail.left = null;left_tail.right = tmp;}TreeNode right_tail = preorder(tmp);return right_tail == null ? (left_tail == null ? root: left_tail): right_tail;}public void flatten(TreeNode root) {preorder(root);} }二面
合并k個有序鏈表為一個有序鏈表。這是LeetCode上的原題:Merge k Sorted Lists. 我的做法是用一個優先隊列維護k個鏈表的表頭,每次從優先隊列中取出隊首元素作為合成鏈表的一個節點,并將所在鏈表的頭指針后移并加入優先隊列,如此循環直到優先隊列為空。記合成鏈表的長度為n, 則建優先隊列的復雜度為O(k), 從優先隊列中取隊首并將新元素插入優先隊列的復雜度為O(logk), 這樣的出隊入隊操作要重復n次,所以總復雜度為O(k+nlogk) = O(nlogk). 更加詳細的解題報告見我的博客LeetCode 23. Merge k Sorted Lists(最小堆)。由于現場面試官允許使用Java自帶的優先隊列類,故我在面試現場沒有手寫一個最小堆來實現優先隊列:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution { class Node {public int val;public int index;public Node(int val, int index){this.val = val;this.index = index;}public Node(Node node){this.val = node.val;this.index = node.index;}}public ListNode mergeKLists(ListNode[] lists) {int k = lists.length, i = 0, value = 0;if (k == 0){return null;}PriorityQueue<Node> queue = new PriorityQueue<Node>(1, new NodeComparator implements Comparator<Node>() {@Overridepublic int compare(Node n1, Node n2){return n1.val - n2.val;}} );ListNode head = null, ret = null;for (i=0; i<k; i++){if (lists[i] != null){queue.add(new Node(lists[i].val, i));lists[i] = lists[i].next;}}if (queue.size() == 0){return null;}while (!queue.isEmpty()){Node cur = queue.poll();if (head == null){head = new ListNode(cur.val);ret = head;}else{head.next = new ListNode(cur.val);head = head.next;}if (lists[cur.index] != null){queue.add(new Node(lists[cur.index].val, cur.index));lists[cur.index] = lists[cur.index].next;}}return ret;} }總結
以上是生活随笔為你收集整理的快手算法岗日常实习面试经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net Core怎么使用Hangfir
- 下一篇: R绘制九象限图