您的位置:首页 > 其它

阿里巴巴2014秋季校园招聘-软件研发工程师笔试题 续

2013-09-21 23:32 696 查看
第三部分

25、某二叉树的前序遍历序列为-+a*b-cd/ef,后序遍历序列为abcd-*+ef/-,问其中序遍历序列是——。

答案:a+b*c-d-e/f

26、某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候1,5,1,3,2,4,1,2出现缓存命中的次数是——。最后缓存中即将准备淘汰的数据项是——。

答案:3,3

解释:(LRU是Least Recently Used 近期最少使用算法。)1-》1,5-》5,1-》5,1,3-》5,1,3,2-》1,3,2,4-》3,2,4,1-》3,4,1,2-》

首先1调入内存,然后5调入内存,然后1调入内存(命中缓存),然后3调入内存,然后2调入内存,然后4调入内存(将最少使用的5置换出内存),然后1调入内存(命中缓存),然后2调入内存(命中缓存)。最后,最少使用的3将面临被置换出的危险。

27、两个较长的单向链表a和b,为了找出及诶单noed满足node in a并且node in b。请设计空间使用尽量小的算法(用c/c++,java 或者伪代码)

struct node  
{  
    int v;  
    node *next;  
};  
/* 
返回链表的长度 
链表为空 返回0 
*/  
size_t listLen(node * p)  
{  
    size_t num = 0;  
    while (p!=NULL)  
    {  
        num++;  
        p = p->next;  
    }  
    return num;  
}  
// 如果找到了 则返回指针 指向公共节点  
// 如果不存在 则返回空指针  
node * findFirstCommenNode(node * pheada, node * pheadb)  
{  
    size_t lenA = listLen(pheada);  
    size_t lenB = listLen(pheadb);  
   
    node * plistA = pheada;  
    node * plistB = pheadb;  
    //调整长度  
    //plistA 指向较长的一个  
    if (lenA < lenB)  
    {  
        plistB = pheada;  
        plistA = pheadb;  
        size_t t = lenA;  
        lenA = lenB;  
        lenB = t;  
    }  
    while(lenA > lenB)  
    {  
        plistA = plistA->next;  
        --lenA;  
    }  
    //一样长了  
    //寻找公共节点  
    while (plistA!=NULL && plistA != plistB)  
    {  
        plistA = plistA->next;  
        plistB = plistB->next;  
    }  
    return plistA;  
}


算法的空间复杂度O(1),时间复杂度O(m+n)。

28、当存储数据量超出单节点数据管理能力的时候,可以采用的办法有数据库sharding的解决方案,也就是按照一定的规律把数据分散存储在多个数据管理节点N中(节点编号为0,1,2,,,,N-1)。假设存储的数据时a 请完成为数据a计算存储节点的程序。

#define N 5
int hash(int element){
   return element*2654435761;
}
int shardingIndex(int a){
    int p = hash(a);
    _________________________; //这里是空格
    return p;
}

答案:p%=N

29、宿舍内5个同学一起玩对战游戏。每场比赛有一些人作为红方,另一些人作为蓝方。请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛?
答案:4场,分别是AB-CDE、ACD-BE、BCE-AD、DE-ABC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: