快手java开发实习 一面凉经(转载)已大概完成 某些题目真的不会了

作者:yakouhao
链接:https://www.nowcoder.com/discuss/417666?type=post&order=time&pos=&page=1&channel=
来源:牛客网

写在前面:
看了很多牛客的面经,扫一眼问题内容,觉得里面的xx问题,自己复习的时候有cover到,真正面试时候,才知道自己有多naive。
注重原理 不等于 背会原理,也 不等于 只看原理不看应用。没有真材实料,真的是不堪一击。

一面问题:

算法题:
1. 找一棵树距离根结点最深的叶子结点集合
深度优先搜索
(1)维护全局变量maxDep,也就是最大深度,默认为-1
(2)节点深度小于等于max,继续搜索(假设树根节点位于第0层)
(3)节点深度dep大于max,把max设置为当前的深度dep。
之后递归对左右子树调用函数,不过dep要加一(看下面代码就知道了)
运行完,maxDep就知道了
这个代码是1302的代码,求层数最深的叶子结点的和
class Solution {
    int maxDepth = -1;
    int sum = 0;
    public int deepestLeavesSum(TreeNode root) {
        return dfs(root, 0);
    }
    private int dfs(TreeNode root, int depth) {
        if (root == null) {
            return 0;
        }
        if (maxDepth < depth) {
            maxDepth = depth;
            sum = root.val;
        } else if (depth == maxDepth) {
            sum += root.val;
        }
        if (root.left != null) {
            dfs(root.left, depth + 1);
        }
        if (root.right != null) {
            dfs(root.right, depth + 1);
        }
        return sum;
    }
}

  之后层次遍历,找到对应的层数,把队列里面的元素加入集合。


2. 数据处理,30亿行的文件,写的是用户id,找不重复的用户id有多少,允许精确度丢失1%
 
不会
 
问答题:
(1)String类型list转long类型,考察Arraylist和LinkedList
Long.parseLong()
 
 
 

(2)hashmap put get 方法。map.put(1L, "1"); map.get(1)输出的是什么(我感觉输出是null,因为get是对key来说的)

 


(3)mysql,innodb索引如何实现范围查找(半懂)
 
 
 
 

(4)二级索引叶子结点存放的是什么(二级索引,也就是上面innoDB引擎的辅助索引,存储的是主键值)

(5)覆盖索引是什么,在编写sql的时候要注意哪些问题
解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫 做覆盖索引。
(6)数据库隔离原则,以及常用隔离原则的实现原理(原理不清楚)

(7)操作系统虚拟内存置换算法
 

(9)SYN Flood 半开放攻击
不懂
(10)java内存模型

 

 

 


(11)volatile关键字,讲一下原理和应用的场景
加了volatile关键字的代码生成的汇编代码发现,会多出一个lock前缀指令。Lock指令对Intel平台的CPU,早期是锁总线,这样代价太高了,后面提出了缓存一致性协议,MESI,来保证了多核之间数据不一致性问题。保证线程读到的永远是最新值。
volatile关键字是用来保证有序性和可见性的。
 
 

(12)bash
不懂
这其中有一部分问题因为我的无知所以面试官也跳过了,总之一场下来,让自己清晰地认识到自身的局限,凉凉。
原文地址:https://www.cnblogs.com/lzh1043060917/p/12841134.html