美团面试记录

一面:

1、开场先进行了一下自我介绍
2、问了问实习公司的项目
3、算法题让说一下简单的思路

假设有一套业务系统,服务于最多1000万用户。

每个用户通过唯一的用户名标识,用户名可以包含数字、字母、下划线,不超过16个字符。

用户需要通过“注册”的动作,将自己的用户名注册到业务系统上,注册成功后业务系统随机为其分配一个[0,31]的数字。

用户可以注销自己的用户名。注销时,用户需要输入自己的用户名,业务系统删除保存的用户名和与之对应的数字。

用户也可以通过自己的用户名查找或修改业务系统为其分配的数字。

(1)请设计一种算法实现上述需求。操作速度优先。方便起见,用户名以及对应的数字都保存在内存中。

(2)如果用户名限制为中国大陆的手机号码(假设目前共13013120个号段),为追求上述操作速度最快,请问你有何建议?

4、问了一下 用没用过js、计算机网络方面的知识熟不熟
5、说一下hashmap
6、说一下 Redis 持久化

一面被重置

1、MysQl用的什么数据结构,MySQL的btree索引和hash索引的区别[12]

2、链表和数组的区别,为什么用数组查找的快,分别在什么情况下用

3、说一下Hash表[1, 2]

4、链表反转

public static ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode last;
        while (cur != null) {
            last = cur.next;
            cur.next = pre;
            pre = cur;
            cur = last;
        }
        return pre;
    }

5、前序遍历和中序遍历构建二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    /*
       根据 前序遍历 和 中序遍历 的特点构建二叉树
            
            前序遍历:  [根节点 | 左子树 | 右子树]
            中序遍历:  [左子树 | 根节点 | 右子树]

       方法:递归

            使用 字典 存储中序遍历遍历中各个节点的值及其索引
            前序遍历第一个元素一定为根节点
            根据根节点值与 字典找到 中序遍历中根节点索引
            因为 前序遍历:  [根节点 | 左子树 | 右子树] 我们不知道左子树的结束位置
            所以我们需要 根据 中序遍历中根节点索引 记录左子树节点个数 右子树节点个数
            左子树节点个数 = 中序遍历中根节点索引 - 开始位置
            右子树节点个数 = 结束位置 - 中序遍历中根节点索引
    
     */
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || preorder.length == 0) {
            return null;
        }
        int len = preorder.length;
        Map<Integer, Integer> treeMap = new HashMap<>();

        for (int i = 0; i < len; i++) {
            treeMap.put(inorder[i], i);
        }
        return buildTree(preorder, 0, len - 1, inorder, 0, len - 1, treeMap);
    }

    public TreeNode buildTree(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd, Map<Integer, Integer> map) {
        if (preStart > preEnd) {
            return null;
        }
        
        int rootIndex = map.get(preorder[preStart]);
        int leftNum = rootIndex - inStart;
        int rightNum = inEnd - rootIndex;
        if (preStart == preEnd) {
            return new TreeNode(preorder[preStart]);
        }

        TreeNode root = new TreeNode(preorder[preStart]);
        root.left = buildTree(preorder, preStart + 1, preStart + leftNum, inorder, inStart, rootIndex - 1, map);
        root.right = buildTree(preorder, preStart + leftNum + 1, preEnd, inorder, rootIndex + 1, inEnd, map);
        return root;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章