IT公司笔试面试题系列(二)
来源:百度文库 编辑:神马文学网 时间:2024/04/28 01:35:19
1.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点
参考:将下一个节点的内容复制到本节点上,然后删除下一个节点。
2.字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
答案:指针变量也占用内存单元,而且所有指针变量占用内存单元的数量都是相同的。就是说,不管是指向何种对象的指针变量,它们占用内存的字节数都是一样的,并且要足够把程序中所能用到的最大地址表示出来(通常是一个机器字长)。
3.类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什
么?
答案:派生类的指针指向基类的对象是错误的,不能通过编译的;基类的指针可以指向派生类的对象,调用派生类的函数。
4.如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量
a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?
答案:第一问调用的是B的。第二问调用A的。
虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果
如果没有定义成虚函数:------
class A{
public:
void print(){ cout<<”This is A”<
class B:public A{
public:
void print(){ cout<<”This is B”<
int main(){
A a;
A* p1=&a;
A* p2=&b;
p1->print();
p2->print();
}
结果是两个This is A
如果定义成虚函数:---------
class A{
public:
virtual void print(){ cout<<”This is A”<
};
class B:public A{
public:
void print(){ cout<<”This is B”<
};
再运行main输出的结果就是This is A和This is B。
5.char **p, a[16][8];
会的,这样会出现编译错误
6.应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?
参考:对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
7.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换
int main()
{
}
结果是
8.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.
答案:
BOOL
{
}
9.写一算法检测单向链表中是否存在环(whether there is a loop in a link list), 要求算法复杂度(Algorithm's complexity是O(n)) 并只使用常数空间(space is O(c)).
注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.(MOTO)
答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;当p2指针追上p1的时候,就表明链表当中有环路了。
int testLinkRing(Link *head)
{