昨天晚上做了微软校招的笔试题目,感觉自己的基础知识还是很不扎实,不能形成一个体系。思考问题的时候,要从自己的体系结构中来思考而不是完全靠直觉,直觉这种东西说有突然就有了,说没有怎么也来不了。很多不该错的题目都弄错了,这完全暴露了自己的基本功还不扎实,不能够运用自如。比如有一道题目求N!后零的个数,这是编程之美上的一道题目,自己虽然知道解法,但忘了具体的原理,感觉虽然看了编程之美好几遍了,还没有将这些东西完全转化为自己的知识,就等于是白看。所以说,一定要静下心来,好好思考,不要着急,错一题会扣分。
1、临界区vs临界资源:临界区是指每个进程中访问临界资源的那段代码,临界资源是一次只允许一个进程使用的共享资源。详见:http://www.uml.org.cn/zjjs/2008111011.asp
windows中进程通信主要有以下几种方法:
1)文件映射(Memory-Mapped Files)
2)共享内存(Shared Memory)
3) 匿名管道(Anonymous Pipe)
4) 命名管道(Named Pipe)
5) 邮件槽(Mailslots)
6) 剪贴板(Clipped Board)
7) 动态数据交换(DDE)
8) 应用程序利用对象连接与嵌入(OLE)
9) 动态连接库
10) 远程过程调用
11) NetBios函数
12) Sockets
13) WM_COPYDATA消息
2、程序输出结果
#include<stdlib.h>
#include<iostream>
using namespace std;
class Base{
public:
char Value(){ return 'A';}
virtual char VirtualValue(){return 'V';}
};
class Derived:public Base{
public:
virtual char Value(){return 'D';}
};
class VirtualDerived:virtual public Base{
public:
char Value(){return 'Z';}
char VirtualValue(){return 'X';}
};
int main(){
Base* b1=new Derived();
Base* b2=new VirtualDerived();
cout<<b1->Value()<<" "<<b1->VirtualValue()<<endl;
cout<<b2->Value()<<" "<<b2->VirtualValue()<<endl;
system("pause");
return 0;
}
结果为:A V
A X
解释:首先我们看一下 class VirtualDerived:virtual public B这句,虚继承以前没见过,查了一下C++ primer后发现,这儿写virtual对这题目的结果并没有什么影响。虚继承(P923),虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态。在虚继承下,对给定虚基类,无论该类在派生类层次中作为虚基类出现多少次,只继承后一个共享的基类子对象。共享的基类子对象成为虚基类。
下面解释第一行的输出,由于Base中并没有将Value()设为虚函数,所以首先输出A是显然的,下面输出V也是更显而可见的了,因为只有子类有这个函数。
第二行:同理首先输出A,由于函数VirtualValue为虚函数,所以根据多态,可得输出的结果为X。
我们对代码添加一些的内容,以便更加便于我们理解:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
class Base{
public:
char Value(){ return 'A';}
virtual char VirtualValue(){return 'V';}
};
class Derived:public Base{
public:
virtual char Value(){return 'D';}
};
class VirtualDerived:virtual public Base{
public:
char Value(){return 'Z';}
char VirtualValue(){return 'X';}
};
class B:public Derived{
char Value(){return 'M';}
};
int main(){
Base* b1=new Derived();
Base* b2=new VirtualDerived();
Derived* b3=new B();
cout<<b3->Value()<<endl;
Base* b4=new B();
cout<<b4->Value()<<endl;
cout<<b1->Value()<<" "<<b1->VirtualValue()<<endl;
cout<<b2->Value()<<" "<<b2->VirtualValue()<<endl;
system("pause");
return 0;
}
则前两行输出的为:
M
A
3、树的层数:从根开始定义,根为第一层,根的子节点为第二层,以此类推;
4、最后一题很经典,将几种排序算法考了一遍,看过算法导论的应该没有什么问题。