阿里技术性面试试题及参考答案文档格式.docx
- 文档编号:17591833
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:16
- 大小:24.05KB
阿里技术性面试试题及参考答案文档格式.docx
《阿里技术性面试试题及参考答案文档格式.docx》由会员分享,可在线阅读,更多相关《阿里技术性面试试题及参考答案文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
<
tmp->
data<
"
\t"
;
tmp=tmp->
}
**题目**:
已知sqrt
(2)约等于1.414,要求不用数学库,求sqrt
(2)精确到小数点后10位。
*考察点
1.基础算法的灵活应用能力(二分法学过数据结构的同学都知道,但不一定往这个方向考虑;
如果学过数值计算的同学,应该还要能想到牛顿迭代法并解释清楚)
2.退出条件设计
*解决办法
1.已知sqrt
(2)约等于1.414,那么就可以在(1.4,1.5)区间做二分
查找,如:
a)high=>
1.5
b)low=>
1.4
c)mid=>
(high+low)/2=1.45
d)1.45*1.45>
2?
high=>
1.45:
low=>
1.45
e)循环到c)
2.退出条件
a)前后两次的差值的绝对值<
=0.0000000001,则可退出
constdoubleEPSINON=0.0000000001;
doublesqrt2(){
doublelow=1.4,high=1.5;
doublemid=(low+high)/2;
while(high-low>
EPSINON){
if(mid*mid>
2){
high=mid;
else{
low=mid;
mid=(high+low)/2;
returnmid;
给定一个二叉搜索树(BST),找到树中第K小的节点。
1.基础数据结构的理解和编码能力
2.递归使用
*示例
5
/\
36
24
/
1
说明:
保证输入的K满足1<
=K<
=(节点数目)
树相关的题目,第一眼就想到递归求解,左右子树分别遍历。
联想到二叉搜索树的性质,root大于左子树,小于右子树,如果左子树的节点数目等于K-1,那么root就是结果,否则如果左子树节点数目小于K-1,那么结果必然在右子树,否则就在左子树。
因此在搜索的时候同时返回节点数目,跟K做对比,就能得出结果了。
/**
*Definitionforabinarytreenode.
**/
publicclassTreeNode{
intval;
TreeNodeleft;
TreeNoderight;
TreeNode(intx){val=x;
classSolution{
privateclassResultType{
booleanfound;
//是否找到
//节点数目
ResultType(booleanfound,intval){
this.found=found;
this.val=val;
publicintkthSmallest(TreeNoderoot,intk){
returnkthSmallestHelper(root,k).val;
privateResultTypekthSmallestHelper(TreeNoderoot,intk){
if(root==null){
returnnewResultType(false,0);
ResultTypeleft=kthSmallestHelper(root.left,k);
//左子树找到,直接返回
if(left.found){
returnnewResultType(true,left.val);
//左子树的节点数目=K-1,结果为root的值
if(k-left.val==1){
returnnewResultType(true,root.val);
//右子树寻找
ResultTyperight=kthSmallestHelper(root.right,k-left.val-1);
if(right.found){
returnnewResultType(true,right.val);
//没找到,返回节点总数
returnnewResultType(false,left.val+1+right.val);
题目**:
LRU缓存机制
设计和实现一个LRU(最近最少使用)缓存数据结构,使它应该支持一下操作:
get和put。
get(key)-如果key存在于缓存中,则获取key的value(总是正数),否则返回-1。
put(key,value)-如果key不存在,请设置或插入value。
当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。
python版本的:
classLRUCache(object):
def__init__(self,capacity):
"
:
typecapacity:
int
self.cache={}
self.keys=[]
self.capacity=capacity
defvisit_key(self,key):
ifkeyinself.keys:
self.keys.remove(key)
self.keys.append(key)
defelim_key(self):
key=self.keys[0]
self.keys=self.keys[1:
]
delself.cache[key]
defget(self,key):
typekey:
rtype:
ifnotkeyinself.cache:
return-1
self.visit_key(key)
returnself.cache[key]
defput(self,key,value):
typevalue:
void
iflen(self.keys)==self.capacity:
self.elim_key()
self.cache[key]=value
defmain():
s=
[["
put"
"
get"
],[[1,1],[2,2],[1],[3,3],[2],[
4,4],[1],[3],[4]]]
obj=LRUCache
(2)
l=[]
fori,cinenumerate(s[0]):
if(c=="
):
l.append(obj.get(s[1][i][0]))
else:
obj.put(s[1][i][0],s[1][i][1])
print(l)
if__name__=="
__main__"
:
main()
c++版本的:
classLRUCache{
public:
LRUCache(intcapacity){
cap=capacity;
intget(intkey){
autoit=m.find(key);
if(it==m.end())return-1;
l.splice(l.begin(),l,it->
second);
returnit->
second->
second;
voidset(intkey,intvalue){
if(it!
=m.end())l.erase(it->
l.push_front(make_pair(key,value));
m[key]=l.begin();
if(m.size()>
cap){
intk=l.rbegin()->
first;
l.pop_back();
m.erase(k);
关于epoll和select的区别,哪些说法是正确的?
(多选)
A.epoll和select都是I/O多路复用的技术,都可以实现同时监听多个I/O事件的状态。
B.epoll相比select效率更高,主要是基于其操作系统支持的I/O事件通知机制,而select是基于轮询机制。
C.epoll支持水平触发和边沿触发两种模式。
D.select能并行支持I/O比较小,且无法修改。
A,B,C
**【延伸】那在高并发的访问下,epoll使用那一种触发方式要高效些?
当使用边缘触发的时候要注意些什么东西?
**
从innodb的索引结构分析,为什么索引的key长度不能太长?
key太长会导致一个页当中能够存放的key的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率。
MySQL的数据如何恢复到任意时间点?
恢复到任意时间点以定时的做全量备份,以及备份增量的binlog日志为前提。
恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的binlog直至指定的时间点。
NFS和SMB是最常见的两种NAS(NetworkAttachedStorage)协议,当把一个文件系统同时通过NFS和SMB协议共享给多个主机访问时,以下哪些说法是错误的:
A.不可能有这样的操作,即把一个文件系统同时通过NFS和SMB协议共享给多个主机访问。
B.主机a的用户通过NFS协议创建的文件或者目录,另一个主机b的用户不能通过SMB协议将其删除。
C.在同一个目录下,主机a通过NFS协议看到文件file.txt,主机b通过SMB协议也看到文件file.txt,那么它们是同一个文件。
D.主机a通过NFS协议,以及主机b通过SMB协议,都可以通过主机端的数据缓存,提升文件访问性能。
输入pingIP后敲回车,发包前会发生什么?
首先根据目的IP和路由表决定走哪个网卡,再根据网卡的子网掩码地址判断目的IP是否在子网内。
如果不在则会通过arp缓存查询IP的网卡地址,不存在的话会通过广播询问目的IP的mac地址,得到后就开始发包了,同时mac地址也会被arp缓存起来。
请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?
A.获取微博通过pull方式还是push方式
B.发布微博的频率要远小于阅读微博
C.流量明星的发微博,和普通博主要区分对待,比如在sharding的时候,也要考虑这个因素
现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?
请详述技术方案!
A.借助消息中间件,通过发布者订阅者模式来进行任务分配
B.master-slave部署,由master来分配任务
C.不借助任何中间件,且所有节点均等。
通过数据库的update-returning,从而实现节点之间任务的互斥
有一批气象观测站,现需要获取这些站点的观测数据,并存储到Hive中。
但是气象局只提供了api查询,每次只能查询单个观测点。
那么如果能够方便快速地获取到所有的观测点的数据?
A.通过shell或python等调用api,结果先暂存本地,最后将本地文件上传到Hive中。
B.通过datax的httpReader和hdfsWriter插件,从而获取所需的数据。
C.比较理想的回答,是在计算引擎的UDF中调用查询api,执行UDF的查询结果存储到对应的表中。
一方面,不需要同步任务的导出导入;
另一方面,计算引擎的分布式框架天生提供了分布式、容错、并发等特性。
如何实现两金额数据相加(最多小数点两位)?
其实问题并不难,就是考察候选人对JavaScript数据运算上的认知以及考虑问题的缜密程度,有很多坑,可以用在笔试题,如果用在面试,回答过程中还可以随机加入有很多计算机基础的延伸。
回到这个问题,由于直接浮点相与加会失精,所以要转整数;
(可以插入问遇到过吗?
是否可以举个例子?
)。
转整数是第一个坑,虽然只有两位可以通过乘以100转整数,但由于乘以一百和除以一百都会出现浮点数的运算,所以也会失精,还是要通过字符串来转;
(可以插入问字符串转整数有几种方式?
)字符串转整是第二个坑,因为最后要对齐计算,如果没考虑周全先toFixed
(2),对于只有一位小数点数据进入计算就会错误;
转整数后的计算是个加分点,很多同学往往就是直接算了,如果可以考虑大数计算的场景,恭喜同学进入隐藏关卡,这就会涉及如何有效循环、遍历、算法复杂度的问题。
关于并行计算的一些基础开放问题。
◼如何定义并计算,请分别阐述分布式内存到共享内存模式行编程的区别和实现(例子代码)?
◼请使用MPI和OpenMP分别实现N个处理器对M个变量的求和?
◼请说明SIMD指令在循环中使用的权限?
向量化优化有哪些手段?
◼请用Amdahl定律说明什么是并行效率以及并行算法的扩展性?
并说明扩展性的性能指标和限制因素,最后请说明在共享内存计算机中,共享内存的限制?
OpenMP是怎样实现共享内存编程环境的?
MPI阻塞和非阻塞读写的区别?
(简要答案,但必须触及,可以展开)
◼同时执行多个/算法/逻辑操作/内存访问/IO,相互独立同时运行,分三个层次:
进程级,多个节点分布式内存通过MPI通信并行;
线程级,共享内存的多路机器,通过OpenMP实现多线程并行;
指令集:
通过SIM指令实现单指令多数据。
。
举例吧啦吧啦。
◼MPI代码,,,OpenMP代码,分别写出来M个元素,N个处理器的累加,后者注意private参数。
◼SIMD在循环中的应用,限制在于SIMD指令处理的每一个数组的长度,cacheline利用,内部循环间的依赖和条件调用等。
◼向量化,主要看SSE和AVX指令占比率,通过编译器优化......在loop代码中使用。
◼性能和计算规模随处理器增加的变化曲线,实测HPL和峰值HPL比率,能用用Amdahl定律表达Tpar(N)=(an+(1-a)n/N)t+C(n,N),能够讲明白串行部分对整个并行的天花板效应,扩展性能够解释清楚算法的扩展性=并行效率随处理器数目的变化关系,画出来。
◼共享内存计算机OpenMP对变量的限制描述,EREW,CREW,ERCW,CRCW等区别,NUMA概念,如何保持coherent等。
◼写出OpenMP和MPI的核心函数,回答问题即可。
请计算XILINX公司VU9P芯片的算力相当于多少TOPS,给出计算过程与公式。
基于不同的算法,这个值在十几到几百之间。
但是,如果只是单纯比算力,FPGA和ASIC、GPU相比并无太大优势,甚至大多时候有较大劣势。
FPGA的优势在于高度的灵活性和算法的针对性。
一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素?
**及格:
每执行一条mov指令需要消耗1个时钟周期,所以每秒执行的mov指令和CPU主频相关。
**加分:
在CPU微架构上,要考虑数据预取,乱序执行,多发射,内存stall(前端stall和后端stall)等诸多因素,因此除了cpu主频外,还和流水线上的效率(IPC)强相关,比较复杂的一个问题。
最大频率栈。
实现FreqStack,模拟类似栈的数据结构的操作的一个类。
FreqStack有两个函数:
push(intx),将整数x推入栈中。
pop(),它移除并返回栈中出现最频繁的元素。
如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。
◼示例:
push[5,7,5,7,4,5]
pop()->
返回5,因为5是出现频率最高的。
栈变成
[5,7,5,7,4]。
返回7,因为5和7都是频率最高的,但7最接近栈
顶。
栈变成[5,7,5,4]。
返回5。
栈变成[5,7,4]。
返回4。
栈变成[5,7]。
令freq作为x的出现次数的映射Map。
此外maxfreq,即栈中任意元素的当前最大频率,因为我们必须弹出频率最高的元素。
当前主要的问题就变成了:
在具有相同的(最大)频率的元素中,怎么判断那个元素是最新的?
我们可以使用栈来查询这一信息:
靠近栈顶的元素总是相对更新一些。
为此,我们令group作为从频率到具有该频率的元素的映射。
到目前,我们已经实现了FreqStack的所有必要的组件。
算法:
实际上,作为实现层面上的一点细节,如果x的频率为f,那么我们将获取在所有group[i](i<
=f)中的x,而不仅仅是栈顶的那个。
这是因为每个group[i]都会存储与第i个x副本相关的信息。
最后,我们仅仅需要如上所述维持freq,group,以及maxfreq。
**参考代码***:
classFreqStack{
Map<
Integer,Integer>
freq;
Integer,Stack<
Integer>
>
group;
intmaxfreq;
publicFreqStack(){
freq=newHashMap();
group=newHashMap();
maxfreq=0;
publicvoidpush(intx){
intf=freq.getOrDefault(x,0)+1;
freq.put(x,f);
if(f>
maxfreq)maxfreq=f;
puteIfAbsent(f,z->
newStack()).push(x);
publicintpop(){
intx=group.get(maxfreq).pop();
freq.put(x,freq.get(x)-1);
if(group.get(maxfreq).size()==0)
maxfreq--;
returnx;
给定一个链表,删除链表的倒数第N个节点,并且返回链表的头结点。
给定一个链表:
1->
2->
3->
4->
5,和n=2.
当删除了倒数第二个节点后,链表变为1->
5.
说明:
给定的n保证是有效的。
要求:
只允许对链表进行一次遍历。
我们可以使用两个指针而不是一个指针。
第一个指针从列表的开头向前移动n+1步,而第二个指针将从列表的开头出发。
现在,这两个指针被n个结点分开。
我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。
此时第二个指针将指向从最后一个结点数起的第n个结点。
我们重新链接第二个指针所引用的结点的next指针指向该结点的下下个结点。
**参考代码**:
publicListNoderemoveNthFromEnd(ListNodehead,intn)
ListNodedummy=newListNode(0);
dummy.next=head;
ListNodefirst=dummy;
ListNodesecond=dummy;
//Advancesfirstpointersothatthegapbetweenfirst
andsecondisnnodesapart
for(inti=1;
i<
=n+1;
i++){
first=first.next;
//Movefirsttotheend,maintainingthegap
while(first!
=null){
second=second.next;
second.next=second.next.next;
returndummy.next;
```
**复杂度分析:
*时间复杂度:
O(L),该算法对含有L个结点的列表进行了一次遍历。
因此时间复杂度为O(L)。
*空间复杂度:
O
(1),我们只用了常量级的额外空间。
题目:
给定一个整数数组和一个整数,返回两个数组的索引,这两个索引指向的数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 阿里 技术性 面试 试题 参考答案