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

找工过程中碰到的笔试面试题整理(4)

2010-05-26 16:44 507 查看
继续我的找工笔试面试题整理。

1.加法实现n*n,要求时间复杂度O(logN)

要求不能用乘法,不考虑溢出问题,n为正整数。这个是面试的时候问到的,我没有想到较好的解决方案。只想到下面方法,思路就是每次加1倍,最后再判断不足一倍的部分。不知是否合乎要求。有人有好方法的不妨回复一下。:)

代码

class A
{
public:
virtualvoid foo(double)=0;
};
class B
{
public:
virtualvoid foo(int)=0;
};
class C:public A,public B
{
public:
void foo(double)
{
printf("double,");
}
void foo(int)
{
printf("int,");
}
};
int main()
{
C* pc =new C;
void* pvoid = pc;
((B*)(A*)pc)->foo(0); //由于首先转成A类指针,此时再转B,将会破坏B的虚表,只保留A的虚表,因此调用A的虚函数
((C*)(B*)(A*)pc)->foo(0);//由于(B*)(A*)已经将B的虚表破坏,再转成C也还是只有A的虚表,因此调用A的虚函数
((A*)(B*)pc)->foo(0); //同上,A的虚表被破坏,只有B的
((B*)pvoid)->foo(0); //由于不知道pvoid的具体类型,因此会将处于内存布局前面的虚表指针(A的虚表指针)拷贝出来,再销毁内存布局前面的虚表指针,再将拷贝出来的虚表指针覆盖要转换的B类的虚表指针,此时B的虚表指针被A的虚表指针覆盖了。
((A*)pvoid)->foo(0); //同上,先拷贝内存布局前面的虚表指针(A),再销毁内存布局前面的指针,再将拷贝出来的虚表指针覆盖要转换的目标类A的虚表指针。
((B*)(C*)pvoid)->foo(0);
delete pc;
return0;
}

上述示例如有错误请回复告知,3Q。:)

笔试面试题基本就整理到此了,还有很多基本的知识都是常见的,我这里就不整理了。希望能给面试笔试的同学带来帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: