注意:线程是 系统调度和分派的基本单位
进程是资源分配的基本单位
1. (单选题,5.0分)分析下列代码,运行main方法后,会打印什么内容?(A)
A.Thread-0
Thread-1
B. 每行会打印Thread-0或Thread-1,但是不是交替出现的,而是无规律
C. Thread-0
Thread-1
Thread-0
Thread-1
D. Thread-0
解析:该程序发生了死锁,两个人互相占着对方的锁资源。
2. (单选题,5.0分)以下JS程序段的运行结果为:(C)
var a = 1; console.log(a) let a = 6;
A. undefined
B. 6
C. 运行错误
D. 1
解析:var 声明的范围是函数作用域,let 和 const 声明的范围是块作用域 var 声明的变量会被提升到函数作用域的顶部,let 和 const 声明的变量不存在提升,且具有暂时性死区特征 var 允许在同一个作用域中重复声明同一个变量,let 和 const 不允许
3. (单选题,5.0分)运行以下JavaScript程序段的结果为:(D)
var a = 1; console.log(a) var a = 6;
A. undefind
B. 6
C. 运行错误
D. 1
解析:重复用var定义相同的变量只是相当于一次赋值操作,不会覆盖到前面去,执行结果还是会按照上下文顺序来
4. (单选题,5.0分)(哔哩哔哩2021校园招聘后端开发方向笔试卷A)下列正则表达式不能完全匹配字符串aabbb的是(C)
A.[a-z]*
B.a{2}b{3}
C.a+b?
D.a+b+c*
解析:
字符?指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
使用 + 匹配1个到无数个,使用 *代表0个到无数个。即:+等价于{1,},*等价于{0,}
5. (单选题,5.0分)判断以下程序的运行结果(D)
console.log(null == undefined)
A. 运行错误
B. undefined
C. false
D. true
解析:Javascript规范中提到, 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。null 和 undefined都代表着无效的值。
全等于状态下,是false,这个很好理解了。它们不属于同一数据类型。
console.log( undefined === null ) //false
typeof null //object
typeof undefined //undefined
6. (单选题,5.0分)以下JS程序段的运行结果为(B)
typeof null
A. number
B. object
C. NULL
D. string
解析:为什么typeof null结果为object呢,这个官方给出了解释:
7.下图是一种名为跳表(skiplist)的数据结构,它允许快速查询,插入和删除一个有序连续元素的数据链表,其平均查找和插入时间复杂度都是O(logn)。
快速查询是通过维护一个多层次的链表,每一层的首尾是假结点,除头尾节点外每层的数据都是有序的,最底层即Level1存放的是所有数据,而上面的每一层都可认为是通过某种算法建立起来的索引,且当数据量够大时可以认为第N层结点是第N-1的一半。一开始,算法在最稀疏的层次(即最顶层)进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。
算法以Top指向的最顶层的假头结点为入口,试依次写出查找85经过的结点的值(以-1开头,85结尾)
格式如下(假定过程为-1->1->2->4) [-1,1,2,4]
[-1,21,37,37,71,71,85]
解析:其中37->37,71->71是因为查找的元素在该层两个相邻的元素中间。此时,算法将跳转到下一个层次
8. (多选题,5.0分)以下关于get 和 post 请求的区别,正确的有哪些?(ABC)
A. get 请求会被浏览器主动缓存,而 post 不会。
B. post 参数传输更安全,get 的参数会明文限制在 url 上,post 不会。
C.get 传递参数有大小限制,而 post 没有。
解析:get 请求会被浏览器主动缓存,而 post 不会。
9. (多选题,5.0分)(京东2019春招京东算法类试卷 )用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(O>P),那么模拟实现的队列最大容量是多少?(C)
A.2O+1
B.2O-1
C.2P+1
D.O+P
解析:用容量为m(较大的)的栈作为存储空间,容量为n的栈作为输出缓冲区,先将入队的前n个元素push进存储空间栈
随后对存储空间栈中的每个元素进行出栈(pop)操作,继而压入(push)输出缓冲区栈
对于剩余入队的前n+1个元素,将他们压入存储空间栈
此时已经入队了2n+1个元素,若此时进行出队操作,先将输出缓冲区栈中的元素出栈(pop)并输出:Q1,Q2,......,Qn,再对存储空间栈中的n个元素进行出栈(pop)并压入输入缓冲区栈
然后对存储空间栈进行一次出栈(pop)操作并输出:Qn+1,最后再对输出缓冲区栈中的所有元素进行出栈(pop)操作并输出Qn+2,Qn+3,......,Q2n,Q2n+1。这样两个栈总的输出序列为:Q1,Q2,......,Qn,Qn+1,Qn+2,Qn+3,......,Q2n,Q2n+1
10.关于并发,哪些说法是正确的(ABD)
A. "可见性"的意思是当一个线程修改共享变量时,另外一个线程能读到这个修改的值。
B. Java中所有使用的并发机制依赖于JVM的实现和CPU的指令
C. synchronized是一个轻量级的锁
D. 如果volatile变量修饰符使用恰当的话,他比synchronized的使用和执行成本更低。
解析:synchronized这个关键字,原来的印象就是一个重量级锁,也就是悲观锁,直接锁住代码段,剩余的线程进入到阻塞队列中,效率极低,实际上呢,在jdk1.6之后,synchronized的内部进行了优化,它不再是一个简单的重量级锁,它为了试用所有的情况,有了一个锁升级流程:
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁
11. (填空题,5.0分)设树T的度为4,其中度为1、2、3和4的结点个数分别为4、1、1、1,则树T中叶子结点个数为 (7)
解析:
度:
在无向图中,每个节点连边的条数就是该节点的度数。
而在有向图中,指向该节点的边数称为入度;反之,则称为出度。某点度的大小等于出入度之和。
在树中,节点的度是指一个节点含有的子树的个数,也就是:在树中,结点有几个分叉,度就是几。
叶节点或终端节点:度为0的节点称为叶节点;
非终端节点或分支节点:度不为0的节点;
树的度:一棵树中,最大的节点的度称为树的度;
公式:
①二叉树中叶子结点总是比度为2的结点多一个,
故总结点=叶子节点数+度为1的节点数+度为2的节点数
②N个结点的树有N-1条边。还有另一种表述方式:
树中结点数 = 总分叉数 +1。(这里的分叉数就是所有结点的度之和),本质上其实是一样的
此题未告知是二叉树,可用公式②,此处我用公式②演算:
非叶结点的个数:4+1+1+1=7
此树的边的条数:1×4+2×1+3×1+4×1=13
设叶结点个数:x
则等式:7+x-1=13
得x=7
所以有7个叶结点
12.用户表user{id:用户编号,name:用户名}
网站表site{id:网站编号,site_name:网站名}
访问记录表visit{user_id:访问者编号,site_id:网站编号,visit_time:访问时间}
1、查询出访客数前三的网站名(一个人多次访问同一网站也只算一个访客)
2、查询出被访问次数前三的网站名
1.
select site_name
from site
where id in(
select site_id
from visit
group by site_id
order by count(distinct user_id) desc
limit 3;
)
2.
select site_name
from site
where id in(
select site_name
from visit
group by site_id
order by count(user_id) desc
limit 3;
)