快手算法岗日常实习面试经验
时间: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