您的位置:首页 > 职场人生

阿里巴巴历年笔试面试70题 [11-15]

2015-05-29 14:48 309 查看
11、死锁的条件。(互斥条件(Mutual exclusion):1、资源不能被共享,只能由一个进程使用。2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

处理死锁的策略:1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。2.检测死锁并且恢复。3.仔细地对资源进行动态分配,以避免死锁。4.通过破除死锁四个必要条件之一,来防止死锁产生。)

12、一个树被序列化为数组,如何反序列化。

from: http://m.blog.csdn.net/blog/yusiguyuan/42393991
假定二叉树如下所示:

_30_
/    \
10    20
/     /  \
50    45  35

则使用先序遍历,保存到文件中的内容如下:

30 10 50 # # # 20 45 # # 35 # #

序列化二叉树

先序遍历的代码可以完成序列化二叉树的工作,不管你信不信,反正我是信了。代码如下:

void SerializeBinaryTree(BinTree *p, ostream &out)  //BinaryTree是二叉树结构体,typedef struct node BinaryTree.
{
if (!p) {
out << "# ";
} else {
out << p->data << " ";
SerializeBinaryTree(p->left, out);
SerializeBinaryTree(p->right, out);
}
}


反序列化二叉树

从文件中读取二叉树结点并重构的方法与前面相似。采用先序遍历的思想每次读取一个结点,如果读取到NULL结点的标识符号“#”,则忽略它。如果读取到结点数值,则插入到当前结点,然后遍历左孩子和右孩子。

void readBinaryTree(BinTree *&p, ifstream &fin)
{
int token;
bool isNumber;
if (!readNextToken(token, fin, isNumber)) //readNextToken读取文件下一个值,如果是数字返回true,否则返回false
return;
if (isNumber) {
p = new BinTree;
p->value = toekn;         //newNode函数创建新结点,设定data为token,left和right初始化为NULL
p->left = NULL;
p->right = NULL;
readBinaryTree(p->left, fin);
readBinaryTree(p->right, fin);
}
}


13、如何将100百万有序数据最快插入到STL的map里。

14、有两个线程a、b分别往一条队列push和pop数据,在没有锁和信号量的情况下如何避免冲突访问。

15、写一个函数,功能是从字符串s中查找出子串t,并将t从s中删除。

from: http://blog.csdn.net/xingfudage1986/article/details/6870942
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: