一面:
1、开场先进行了一下自我介绍
2、问了问实习公司的项目
3、算法题让说一下简单的思路
假设有一套业务系统,服务于最多1000万用户。
每个用户通过唯一的用户名标识,用户名可以包含数字、字母、下划线,不超过16个字符。
用户需要通过“注册”的动作,将自己的用户名注册到业务系统上,注册成功后业务系统随机为其分配一个[0,31]的数字。
用户可以注销自己的用户名。注销时,用户需要输入自己的用户名,业务系统删除保存的用户名和与之对应的数字。
用户也可以通过自己的用户名查找或修改业务系统为其分配的数字。
(1)请设计一种算法实现上述需求。操作速度优先。方便起见,用户名以及对应的数字都保存在内存中。
(2)如果用户名限制为中国大陆的手机号码(假设目前共130、131等20个号段),为追求上述操作速度最快,请问你有何建议?
4、问了一下 用没用过js、计算机网络方面的知识熟不熟
5、说一下hashmap
6、说一下 Redis 持久化
一面被重置
1、MysQl用的什么数据结构,MySQL的btree索引和hash索引的区别[1,2]
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;
}
}