迅雷笔试题

原文转载:https://blog.csdn.net/Hackbuteer1/article/details/11482103 2014迅雷校招笔试题

一、单选题(20题,每题2分)
1、有变量int i = 0; int a = i++; int b=++a; int c = a+b; 请问表达式 a?b:c 的值是()
A0              B1              C2             D3

解析:

int i = 0;
int a = i++;   //a=0;i=1
int b = ++a;   //a=1;b=1
int c = a+c;   //c=2

232位环境下,int *p=new int[10];请问sizeof(p)的值为()
A4              B10              C40               D8
解析:

指针即地址,指针几个字节跟语言无关,跟系统的寻址能力有关。

指针在32位环境下占4字节内存大小,在64位环境下占8字节内存大小


3、有语句char str[] = "abcde";请问表达式sizeof(str)的值是()    

A1              B4               C5                D6
解析:sizeof(str)求数组str内存大小,后面还有\0


4、有函数int func(int i)的实现为()

int func(int i)
{
	if(i > 1)
		return i*func(i-1);
	else
		return 1;
}

请问函数调用f(5)的返回值是多少()阶乘计算
A5              B15              C20               D120

解析:实现阶乘的函数,f(5) = 5 * 4 * 3 * 2 * 1 = 120

5、请问以下说法,哪个是正确的()
A、每个类都有一个无参数的构造函数
B、每个类都有一个拷贝构造函数
C、每个类能有多个构造函数
D、每个类能有多个析构函数
解析:每个类只能有一个析构函数

6、用class关键字定义的类,其成员默认的访问属性为()
Aprivate         Bprotected      Cpublic           D、无定义


7、类的成员有三种访问属性,分别是publicprotectedprivate,子类能够访问的成员是()
A、都能访问
Bpublicprotected
Cpublicprivate
D
protectedprivate

8
、请问对一个排好序的数组进行查找,时间复杂度为()
AO(n)            BO(lgn)        CO(nlgn)          DO(1)
解析:如已排好序优先考虑二分法,二分法查找的时间复杂度为O(logn)
 

9、以下二叉树:

后序遍历的结果是()
A、丙乙丁甲戊己    B、甲乙丙丁戊己     C、丙丁乙己戊甲     D、丙丁己乙戊甲
解析:

先序遍历:根左右

中序遍历:左根右

后序遍历:左右根

相关知识点:遍历二叉树的三种方法(先序遍历、中序遍历、后序遍历的递归与非递归实现)

10、看以下代码:

A *pa = new A[10];
delete pa;

则类A的构造函数和析构函数分别执行了几次()
A1   1          B10   10          C1   10                D10   1

11、看以下代码:

class A
{
public:
	~A();
};
A::~A()
{
	printf("delete A ");
}

class B : public A
{
public:
	~B();
};
B::~B()
{
	printf("delete B ");
}

请问执行以下代码

A *pa = new B();
delete pa;

输出的串是()
Adelete A       Bdelete B        Cdelete B delete A          Ddelete A delete B


12、文件长度是一个大于0的整数,用变量unsigned file_length; 来表示,把文件分成块,每块的长度也是一个大于0的整数,用变量unsigned block_length; 来表示,则文件被分成的块数为()
Afile_length/block_length                                         Bfile_length/block_length+1         
C
(file_length+block_length-1)/block_length             D((file_length-1)/block_length+1 

13、整数int i = 0xFE78DA45; int k = 0xAC3189B2;i^k的值为()
A0x524953f7         B0xAC308800          C0xFE79DBF7           D0X0000001
解析:将十六进制转化为二进制进行按位异或^(不相同则取1

14、看以下代码:

class parent
{
public:
	virtual void output();
};
void parent::output()
{
	printf("parent!");
}

class son : public parent
{
public:
	virtual void output();
};
void son::output()
{
	printf("son!");
}

则以下程序段:

son s;
::memset(&s , 0 , sizeof(s));
parent& p = s;
p.output();

执行的结果是()
Aparent!       Bson!       Cson!parent!           D、没有输出结果,程序运行出错

15、函数的局部变量所需存储空间,是在哪里分配的()
A、进程的数据段      B、进程的栈上    C、进程的堆上       D、以上都可以
解析:

堆与栈的区别:

1栈是系统根据变量大小自动分配空间的

堆是用new, malloc等手动分配空间的

2栈内存区的地址是连续的,由系统控制,速度较快

堆内存区的地址是不连续的,它是系统将空闲内存块链接起来的链表

3栈内存是由系统自己分配和释放的

堆内存要由程序员自己全权控制,否则会出现内存泄露

4操作系统给程序运行的内存非了4个区域:
1 代码区:顾名思义就是存放运行的代码的
2 全局数据区:存放全局数据和静态数据以及常量.
3 栈区:函数调用时的返回地址,参数压栈,局部变量,返回数据等都存放在栈区.
4 堆区:存放程序动态分配的内存(由newmalloc等函数分配)


16、以下STL的容器存放的数据,哪个肯定是排好序的()
Avector        Bdeque         Clist             D、map
解析:map是一种有序无重复的关联容器。

17int a[][3]={{1},{3,2},{6,7,8},{9}};a[2][1]的值是()
A3          B6        C2            D7

18、以下关于头文件,说法正确的是()
A#include<filename.h>,编译器寻找头文件时,会从当前编译的源文件所在的目录去找
B#include“filename.h”,编译器寻找头文件时,会从通过编译选项指定的目录去找
C、多个源文件同时用到的全局整数变量,它的声明和定义都放在头文件中,是好的编程习惯
D、在大型项目开发中,把所有自定义的数据类型、全局变量、函数声明都放在一个头文件中,各个源文件都只需要包含这个头文件即可,省去了要写很多#include语句的麻烦,是好的编程习惯。

19、某棵完全二叉树上有699个节点,则该二叉树的叶子节点数为()
A349             B350              C188                D187
解析:n0=n2+1;
n=n0+n1+n2=n0+n1+n0-1=699 

由于完全二叉树中度为1的节点只有0个或1个两种情况,所以,将01带入上面公式,整理后得:  n0=n+1/2或者n0=n/2;  看看n是否能被2整除,能则用n0=n/2。否则用n0=n+1/2 既叶子节点为n0=n+1/2=350

20、在一个指向字符串的指针char *p_str,要把字符串中第4个字符的值改为'a',正确的做法是()
Ap_str[3]='a'            B、*(ptr+3)='a'       Cp_str[4]='a'       D*(ptr+4)='a'

二、多选题(10题,每题3分,错选漏选都不得分)
1、已知一段文本有1382个字符,使用了1382个字节进行存储,这段文本全部是由abcde5个字符组成,a出现了354次,b出现了483次,c出现了227次,d出现了96次,e出现了232次,对这5个字符使用哈夫曼(Huffman)算法进行编码,则以下哪些说法正确()
A、使用哈夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间
B、使用哈夫曼算法进行编码,abcde5个字符对应的编码值是唯一确定的
C、使用哈夫曼算法进行编码,abcde5个字符对应的编码值可以有多套,但每个字符编码的位(bit)数是确定的
Db这个字符的哈夫曼编码值位数应该最短,d这个字符的哈夫曼编码值位数应该最长

2、下列表达式中,不合法的是()
已知:double d = 3.2; int n = 3;
Ad<<2;
Bd/n
C
!d && (n-3)
D(d-0.2)|n

3、下面描述正确的是()
Awhile循环语句的循环体至少执行1
Bdo-while循环可以写成while循环的格式
Ccontinue语句可以出现在各种循环体中
Dbreak语句不可以出现在循环体内

4、关于内联函数正确的是()
A、类的私有成员函数不能作为内联函数
B、在所有类说明中内部定义的成员函数都是内联函数
C、类的保护成员函数不能作为内联函数
D、使用内联函数的地方会在运行阶段用内联函数体替换掉

5、下面模板声明中,哪些是非法的()
Atemplate<class Type>class C1;
Btemplate<class T,U , class V>class C2;
Ctemplate<class C1 , typename C2>class C3{};
Dtemplate<typename myT , class myT>class C4{};

6、在使用浏览器打开一个网页的过程中,浏览器会使用的网络协议包括()
ADNS         BTCP        CHTTP            DTelnet

7
、下面属于构造散列函数的方法是()
A、直接定址法
B、数字分析法
C、乘余取整法
D、平方取中法

解析:

8、拷贝构造函数的特点是()
A、该函数名同类名,也是一种构造函数,该函数返回自身引用
B、该函数只有一个参数,必须是对某个对象的引用
C、每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员
D、拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象

9、下列关于虚函数的说法正确的是()
A、在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。
B、在析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。
C、静态函数不可以是虚函数
解析:因为静态成员函数没有this,也就没有存放vptr的地方,同时其函数的指针存放也不同于一般的成员函数,其无法成为一个对象的虚函数的指针以实现由此带来的动态机制。静态是编译时期就必须确定的,虚函数是运行时期确定的。
D、虚函数可以声明为inline
解析:inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。
因此,内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。
函数的inline属性是在编译时确定的, 然而,virtual的性质则是在运行时确定的,这两个不能同时存在,只能有一个选择,文件中声明inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。
我并不否认虚函数也同样可以用inline来修饰,但你必须使用对象来调用,因为对象是没有所谓多态的,多态只面向行为或者方法,但是C++编译器,无法保证一个内联的虚函数只会被对象调用,所以一般来说,编译器将会忽略掉所有的虚函数的内联属性。

相关知识点:什么函数不能声明为虚函数?
一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。 
设置虚函数须注意: 
1只有类的成员函数才能说明为虚函数; 
2
:静态成员函数不能是虚函数; 
3
:内联函数不能为虚函数; 
4
:构造函数不能是虚函数; 
5
:析构函数可以是虚函数,而且通常声明为虚函数。

10、下列对函数double add(int a , int b)进行重载,正确的是()
Aint add(int a ,int b ,int c)
B
int add(double a , double b)
C
double add(double a , double b)
Dint add(int a , int b)

解析:重载条件:函数名相同,参数个数不同,参数类型不同,只有返回值不同不构成重载
三、填空题(15空,每空2分)
1、以下代码是用来计算100以内的素数的个数,请把相应的空填上。

struct prime_number_node
{
	int prime_number;
	prime_number_node* next;
};

int calc_prime_number()
{
	prime_number_node* list_head = new prime_number_node();
	list_head->next = NULL;
	list_head->prime_number = 2;
	prime_number_node* list_tail = list_head;
	for(int number = 3 ; number < 100 ; number++)
	{
		int remainder;
		prime_number_node* cur_node_ptr = list_head;
		while(cur_node_ptr != NULL)
		{
			remainder = number%cur_node_ptr->prime_number;
			if(remainder == 0)
			{
				    //1   break;
			}
			else
			{
				    //2    cur_node_ptr = cur_node_ptr->next;
        }
		}
		if(remainder != 0)
		{
			prime_number_node* new_node_ptr = new prime_number_node(); 
			new_node_ptr->prime_number = number;
			new_node_ptr->next = NULL;
			list_tail->next = new_node_ptr;
			            //3   list_tail = list_tail->next; 
		}
	}
	int result = 0;
	while(list_head != NULL)
	{
		result++;
		prime_number_node* temp_ptr = list_head;
		list_head = list_head->next;
		                    //4  delete temp_ptr;
	}
	return result;
}

2、已知集合AB的元素分别用不含头结点的单链表存储,函数difference()用于求解集合AB的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}
链表结点的结构类型定义如下:

求差集的思路:在集合A中减掉集合B中相同的元素,删掉集合A中5的方法——在集合A中先将10赋值给5,然后删除掉10所在的结点。

struct node
{
	int elem;
	node* next;
};

void difference(node** LA , node* LB)
{
	node *pa , *pb , *pre , *q;
	pre = NULL;
	                                         //1  pa = *LA;
	while(pa)
	{
		pb = LB;
		while(   )                       //2  pb && pa->elem != pb->elem
			pb = pb->next;
		if(    )                         //3   pb
		{
			if(!pre)
				*LA =      ;     //4  pa->next
			else
				 = pa->next;     //5  pre->next
			q = pa;
			pa = pa->next;
			free(q);
		}
		else
		{
			       ;                 //6  pre = pa;
			pa = pa->next;
		}
	}
}



代码中的指针pa用于指向集合A的元素;pb指向集合B的元素;临时指针q指向需要被删除的元素;pre用于实现删除时结点的链接,与pa保持所指结点的前后继关系。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值