搜狐 2022 C++工程师面试题(应聘 求职 面试准备资料)_第1页
搜狐 2022 C++工程师面试题(应聘 求职 面试准备资料)_第2页
搜狐 2022 C++工程师面试题(应聘 求职 面试准备资料)_第3页
搜狐 2022 C++工程师面试题(应聘 求职 面试准备资料)_第4页
搜狐 2022 C++工程师面试题(应聘 求职 面试准备资料)_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

搜狐2022C++工程师面试题

第1题:一、单选题

假设整数0x12345678存放在内存地址0x0开头的连续四个字

节中(即地址0x0到0x3).那么在以LittleEndian字节序存储的

memory中,地址0x3的地方存放的字节是:

A、0x12

B、0x34

C、0x56

D、0x78

1、A

a)Little-Endian就是低位字节排放在内存的低地址端,高位字节

排放在内存的高地址端。

b)Big-Endian就是高位字节排放在内存的低地址端,低位字节排放

在内存的高地址端。

c)网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因

此TCP/IP协议中使用的字节序通常称之为网络字节序。

假如是Little-Endian:0x0-0x3内存分别存放的是:0x78、0x56、0x34、

0x12;

假如是Big-Endian:0x0-0x3内存分别存放的是:0xl2、0x34、

0x56、0x78;

第2题:

2、以下代码输出的是_?

intfoo(intx,inty)

(

if(x=0||y=0)return1;

return3*foo(x-l,y/2);

)

coutfoo(3,5)endl;

A、81

B、27

C、9

D、3

2、B

递归:3*3*3*f(0,0)=3*3*3*1=27。

第3题:

-2-

3、给定下列程序,那么执行printf("%\n",foo(20,13));的输出结

果是多少?

intfoo(intx,inty)

(

if(x<=0||y<=0)

return1;

return3*foo(x-6,y/2);

}

A、3

B、9

C、27

D、81

3、D

第4题:

4、假如x=2022,下面函数的返回值是()

intfun(unsignedintx)

intn=0;

-3-

while((x+l))

n++;

x=x|(x+1);

}

returnn;

)

A、20

B、21

C、23

D、25

4、C

返回值为:23

2022对应的二进制为:0000000000000000000011111011110

而x|(x+1)的作用是对一个数中二进制0的个数进行统计

例如本题:

第一次循环:0000000000000000000011111011110100000000

00000000000011111011110=000000000000000000001111101

1111

其次次循环:0000000000000000000011111011111100000000

-4-

00000000000011111100000=000000000000000000001111111

1111

每循环一次。的数量减一,直到溢出

所以2022二进制中一共有23个0则返回值为23

第5题:

5、以下代码的输出是()

inta[5]={l,2,3A5};

int*ptr=(int*)(a+l);

printf("%d,%d",*(a+l),*(ptr-l));

A、1,2

B、2,5

C、2,1

D、1,5

5、B

a代表的是int*每次步长为一个int

-5-

a代表的是int[]*每次步长为所指向的数组的大小

ptr指向的是数组a最终一个元素的下一个元素

所以ptr-1指向的是数组a的最终一个元素

a+1指向的是数组a的其次个元素

所以正确答案是B

第6题:

6、在linux下64位c程序,请计算输出的三个sizeof分别是()

voidfunc(charstr_arg[100])

(

coutsizeof(str_arg)endl;

}

intmain(intargc,char*argv[])

(

charstr[]="Hello";

char*p=str;

coutsizeof(str)endl;

coutsizeof(p)endl;

func("test");

return0;

-6-

}

A、5,5,8

B、6,6,4

C、6,8,4

D、6,8,8

6、D

这里主要是区分sizeof运算符的测量对象

sizeof(str)测量的是字符数组的占用长度,留意字符串后还有个\0,所

以是6

sizeof(p)测量的是指针的占用长度,64位系统下是8字节

sizeof(str_arg)测量的是指针长度,由于这里是形参。

第7题:

7、下面关于迭代器失效的描述哪个是错误的()

A、vector的插入操作不会导致迭代器失效

B、map的插入操作不会导致迭代器失效

C、vector的删除操作只会导致指向被删除元素及后面的迭代器失

D、map的删除操作只会导致指向被删除元素的迭代器失效

-7-

7、A

由于由Vector的iterator和listiterator方法所返回的迭代器是

快速失败的:假如在迭代器创建后的任意时间从结构上修改了向量

(通过迭代器自身的remove或add方法之外的任何其他方式),则

迭代器将抛出ConcurrentModificationExceptiono

第8题:

8、函数fun的声明为intfun(int*p⑷),以下哪个变量可以作为fun

的合法参数()

A>inta[4][4];

B>int**a;

C、int**a[4]

D>int(*a)[4];

8、B

可以看出fun函数的形参是一个指针数组,也就是指针指向一个地址,

地址中存放的内容也是指针。

A,二维数组,不符合

B,二级指针,也就是指针指向的内容也还是存放指针的,符合

C,二级指针数组,数组的内容是二级指针,不符合

D,数组指针,不符合

第9题:

9、下面说法正确的是()

A、C++已有的任何运算符都可以重载

B、const对象只能调用const类型成员函数

C、构造函数和析构函数都可以是虚函数

D、函数重载返回值类型必需相同

9、B

A不能重载7,由于?在类中对任何成员都有意义,已经成为标准用

法。

不能重载?:,由于这个运算符对于类对象来说没有实际意义,相反还

会引起歧义

还有::

C构造函数不能是虚函数。

D函数重载只跟参数类型和参数个数有关。

-9-

第10题:

10、典型的创建Windows窗口过程的流程为()

A、注册窗口类-创建窗口-显示窗口-更新窗口-消息循环

B、注册窗口类-创建窗口-更新窗口-显示窗口-消息循环

C、创建窗口-注册窗口类-更新窗口-显示窗口-消息循环

D、创建窗口-注册窗口类-显示窗口-更新窗口-消息循环

10、A

在屏幕上显示一个窗口的过程一般有以下步骤,这就是主程序的结构

流程:

(1)得到应用程序的句柄(GetModuleHandle)o

(2)注册窗口类(RegisterClassEx)。在注册之前,要先填写

RegisterClassEx的参数WNDCLASSEX结构。

(3)建立窗口(CreateWindowEx)。

(4)显示窗口(ShowWindows)o

(5)刷新窗口客户区(UpdateWindow)。

(6)进入无限的消息猎取和处理的循环。首先猎取消息(GetMessage),

假如有消息到达,则将消息分派到回调函数处理(DispatchMessage),

假如消息是WM_QUIT,则退出循环。

-10-

第11题:

11、下面哪个API返回的不属于windows内核对象()

A、CreateFile

B、CreateSemaphore

C、CreateDC

D、eateEvent

11、C

ABD选项是内核对象:大事对象HANDLECreateEvent。;文件对象

HANDLECreateFile。;信号量对象HANDLECreateSemaphore();

C选项是GDI对象。设备上下文(HDC)CreateDC

第12题:

12、用户双击鼠标时产生的消息序列,下面正确的是()

A、WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,

WM_LBUTTONUP

B、WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONUP,

WM_LBUTTONDBLCLK

C、WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,

11

WMLBUTTONDBLCLK

D、WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,

WM_LBUTTONUP

12、D

双击即点击左键两下,第一次触发LBUTTONDOWN和LBUTTONUP,

其次次点击时触发双击大事LBUTTONDBLCLK(doubleclick),放掉再

触发LBUTTONUP

第13题:

13、以下关于线程以下描述正确的是()

l.windows线程创建时,默认绑定在1个特定的CPU上

2.可采纳SetThreadAffinityMask接口设置线程与某个cpu绑定

3._beginthreadex比CreateThread创建线程平安是由于使用

_beginthreadex会创建一个_tiddata,在调用一些诸如strtok函数时会

将需要爱护的数据存入」iddata

4.使用_beginthread创建线程时,线程执行函数必需为_cdecl约束

规范,而_beginthreadex指定的线程执行函数必需为_stdcall

A、1,2

B、1,3

-12-

C、1

D、以上都不正确

13、D

解释:1:不正确。windows线程创建时,不会绑定在特定的CPU

上,需要手动绑定,或者调用SetThreadAffinityMask接口进行绑定;

2:正确。参考

/beyond_cn/article/details/15813361

3:不正确。参考2的链接。欢迎各位订正。

4:正确。参考msdn:

_beginthread函数可创建在start_address开头执行例程的线程。

start_address中的例程必需使用—cdecl(用于本机代码)或

_clrcall(用于托管代码)调用商定,并且应没有返回值。

传递给_beginthreadex的start_address中的例程必

需使用—stdcall(用于本机代码)或—circaII(用于托

管代码)调用商定,并且必需返回线程退出代码。

所以,通过1,就能选出Do

第14题:

14、以下哪些线程同步锁可以为递归锁

-13-

1.信号量2.读写锁3.互斥量4.大事5.临界区(CriticalSection)

A、1,3,4,5

B、5

C、3,5

D、1,3,5

14、C

进程/线程同步方法

常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁

(rdlock)>条件变量(cond)>信号量(Semophore)等。

在windows系统中,临界区(CriticalSection)和大事对象(Event)

也是常用的同步方法。

递归锁/非递归锁

Mutex可以分为递归锁(recursivemutex)和非递归锁(non-recursive

递归锁也叫可重入锁(非递归锁也叫不

mutex)oreentrantmutex),

行重入锁

(non-reentrantmutex)o

二者唯一的区分是:

同一个线程可以多次猎取同一个递归锁,不会产生死锁。

假如一个线程多次猎取同一个非递归锁,则会产生死锁。

Windows下的Mutex和CriticalSection是可递归的。

Linux下的pthread_mutex_t锁是默认是非递归的。可以通过设置

—14—

PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t锁设置为递

归锁。

第15题:

15、关于sendmessage和postmessage的区分,下面的说法错误的

是()

A、postmessage发出消息后,将消息放到消息队列中,立刻返回

B、sendmessage发出消息后,始终等到该消息执行完毕,才返回

C、用sendmessage给其他线程创建的窗口发送消息时,消息也会

进消息队列

D、用2个函数只能给当前进程的窗口发送消息

15、D

A:PostMessage只把消息放入队列,不管其他程序是否处理都返回,

然后连续执行,这是个异步消息投放函数。

B:SendMessage必需等待其他程序处理消息完了之后才返回,连续

执行,这是个同步消息投放函数。

C:当某线程调用sendmessage给别的线程创建的窗口时一,发送的消

息首先追加到接收线程的发送消息队列,发送线程处于空闲状态,等

待接收线程处理完他的消息返回给发送线程的应答队列,等到后发送

-15-

线程被唤醒取得应答队列的消息(就是处理完消息的返回值),连续

执行。

D:sendmessage和postmessage都可以给其他线程发送消息

第16题:

16、关于WM_COPYDATA消息的处理,下面描述错误的是()

A、可以在不同进程之间传递少量只读数据

B、只能通过sendmessage方式来发送该消息

C、只能在窗口过程函数中处理该消息

D、可以在消息队列或窗口过程函数中处理该消息

16、C

A:WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。

Windows在通过WM_COPYDATA消息传递期间,不供应继承同步方式。

B;该消息只能由SendMessage。来发送,而不能使用PostMessage()o

由于系统必需管理用以传递数据的缓冲区的生命期,假如使用了

PostMessage(),数据缓冲区会在接收方(线程)有机会处理该数据之

前,就被系统清除和回收。

D:可以在消息队列或窗口过程函数中处理该消息

-16-

第17题:

17、常用的windows进入点函数wWinMain共有四个参数,其中不

包括以下哪种类型的参数()

A、int

B、char*

C、PWSTR

D、HINSTANCE

17、C

WinMain函数的原型声明如下:

intWINAPIWinMain(

HINSTANCEhlnstance,〃handletocurrentinstance

HINSTANCEhPrevinstance,〃handletopreviousinstance

LPSTRIpCmdLine,//commandline

intnCmdShow//showstate

);

第一个参数hlnstance表示该程序当前运行的实例的句柄,这是一

个数值。

其次个参数hPrevInstance表示当前实例的前一个实例的句柄。

第三个参数IpCmdLine是一个以空终止的字符串,指定传递给应用

—17-

程序的命令行参数。

第四个参数nCmdShow指定程序的窗口应当如何显示,例如最大化、

最小化、隐蔽等。

第18题:

18、下列windows消息中,优先级相对较低的是哪一个()

A、WM_MOUSEMOVE

B、WM_TIMER

C、WM_CHAR

D、WM_WINDOWPOSCHANGED

18、B

WM_TIMER消息的优先级最低,所以在有其他消息的状况下,

WM_TIMER消息得不处处理

A:WM_MOUSEMOVE消息在鼠标移动时被发送至已获焦点的窗口

B:Windows定时器是一种周期性的消息产生装置,它会每隔一段指

定时间发送一次定时消息WM_TIMERo

C:未经输入法而直接送人程序中的字符会响应WM_CHAR消息

D:发送此消息给那个窗口的大小和位置已经被转变时,来调用

setwindowpos函数或其它窗口管理函数

-18―

第19题:

19、最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()

A、[3,2,5,7,4,6,8]

B、[2,3,5,7,4,6,8]

C、[2,3,4,5,7,8,6]

D、[2,3,4,5,6,7,8]

19、C

依据堆的删除规章,删除操作只能在堆顶进行,也就是删除0元素。

然后让最终一个节点放在堆顶,做向下调整工作,让剩下的数组依旧

满意最小堆。

删除0后用8填充0的位置,为[832,5,7,4,6]

然后8和其子节点3,2比较,结果2最小,将2和8交换,为:

[2,3,8,5,7,4,6]

然后8的下标为2,其两个孩子节点下标分别为2*2+1=5,2*2+2=6

也就是4和6两个元素,经比较,4最小,将8与4交换,为23,4,5,7,8,6]

这时候8已经没有孩子节点了,调整完成。

-19-

第20题:

20、对一个由A,B,C,D随机组成的序列进行哈弗曼编码,据统计,

各个元素的概率分别为:P(A)=0.4,P(B)=0.35,P(C)=0.2,P(D)=0.05,

请问该编码的平均期望编码长度为()bits?

A、1.45

B、1.7

C、1.85

D、1.92

20、C

首先要建立哈夫曼树,然后计算平均期望编码长度:0.4*1+0.35*2

+0.2*3+0.05*3=1.85

第21题:

21、设有递归算法如下,

intx(intn)

(

if(n=3)

return1;

else

—20—

returnx(n-2)+x(n-4)+l;

)

试问计算x(x⑻)时需要计算()次X函数。

A、8

B、9

C、16

D、18

21、D

x(8)=x(6)+x(4)+l递归计算x⑻第一次调用

x(6)=x(4)+x(2)+l递归计算x⑹其次次调用

x(4)=x(2)+x(0)+l递归计算x(4)第三次调用

x(4)=x(2)+x(0)+l递归计算x(4)第四次调用

之后再调用x()计算黑体部分的结果(5次,加上前面4次,一共9

次),最终x(8)返回值为9

接着计算x(9)

x(9)=x(7)+x(5)+l递归计算x(9)第一次调用

x(7)=x(5)+x(3)+l递归计一算x(7)其次次调用

x(5)=x(3)+x(l)+l递归计算x(5)第三次调用

x(5)=x(3)+x(l)+l递归计算x(5)第四次调用

之后再调用x()计算黑体部分的结果(5次,加上前面4次,一共9

-21-

次),最终x(8)返回值为9

所以总共调用x()的次数是9+9=18

第22题:

22、设一组初始记录关键字序列9出工,丫尸八1\/15肌,力,则按字母升

序的第一趟冒泡排序结束后的结果是()

A、F,H,C,D,P,A,M,Q,R,S,Y,X

B、P,A,C,S,Q,D,F,X,R,H,M,Y

C、A,D,C,R,F,Q,M,S,Y,P,H,X

D、H,C,Q,P,A,M,S,R,D,F,X,Y

22、D

第一趟冒泡:从数组第一个元素到最终一个元素扫描,比较相邻的

元素,假如后一个元素小于前一个,则交换位置。第一趟结束时,最

大元素到达最终一个元素位置

第23题:

23、堆排序的空间简单度是(),堆排序中构建堆的时间简单度是

-22-

()o

A、0(logn),0(n)

B、O(logn),O(nlogn)

C、0(1),0(n)

D、0(1),O(nlogn)

23、C

"空间简单度”指占内存大小,堆排序每次只对一个元素操作,是就

地排序,所用帮助空间0(1),空间简单度是0(1)

在构建堆的过程中,完全二叉树从最下层最右边的非终端结点开头

构建,将它与其孩子进行比较和必要的互换,对于每个非终端结点来

说,其实最多进行两次比较和互换操作,因此整个构建堆的时间简单

度为0(n)o

在正式排序时,第i次取堆顶记录重建堆需要用O(logi)的时间(完全

二叉树的某个结点到根结点的距离为?Iog2i?+1),并且需要取n-1次

堆顶记录,因此,重建堆的时间简单度为O(nlogn)。

第24题:

24、若用一个大小为6的数组来实现循环队列,且当前rear和front

的值分别0和3o当从队列中删除一个元素,再加入两个元素后,rear

-23-

和front的值分别为()

A、2和4

B、1和5

C、4和2

D、5和1

24、A

由于出队时,front=front+l/MAXSIZE,rear不变,所以front=4

入队时,rear=rear+l/MAXSIZE,front不变,所以rear=2;

第25题:

25、如下表是用户是否使用某产品的调查结果()

UID年龄地区学历收入用户是否使用调查产品

1低北方博士低是

2高北方本科中否

3低南方本科高否

4高北方讨论生中是

请计算年龄,地区,学历,收入中对用户是否使用调查产品信息增益

最大的属性(Log23=0.63)

A、年龄

-24-

B、地区

C、学历

D、收入

25、C

不用算一眼就能看出来,全部本科学历都不使用调查产品,全部非本

科学历都使用了调查产品。这种可以确定的划分导致信息嫡为。,信

息增益最大

第26题:

26、假设某算法的计算时间可用递推关系式T(n)=2T(n/2)+n表示,

则该算法的时间简单度为()

A、O(logn)

B、O(n*logn)

C、0(n)

D、0(nA2)

26、B

T(n)=2Ak*(T(n/(2Ak)))+k*n

-25-

2Ak=n,k=log(n)(以2为底)

T(n)=n*T(l)+n*log(n)=c*n*log(n)(c为常数)

所以是O(n*logn)

第27题:

27、基于统计的分词方法为()

A、正向最大匹配法

B、逆向最大匹配法

C、最少切分

D、条件随机场

27、D

目前的分词方法归纳起来有3类:

第一类是基于语法和规章的分词法。其基本思想就是在分词的同时进

行句法、语义分析,利用句法信息和语义信息来进行词性标注,以解

决分词歧义现象。由于现有的语法学问、句法规章非常笼统、简单,基

于语法和规章的分词法所能达到的精确度远远还不能令人满足,目

前这种分词系统还处在试验阶段。

其次类是机械式分词法(即基于词典)。机械分词的原理是将文档中

的字符串与词典中的词条进行逐一匹配,假如词典中找到某个字符

-26-

串,则匹配胜利,可以切分,否则不予切分。基于词典的机械分词法,

实现简洁,有用性强,但机械分词法的最大的缺点就是词典的完备性

不能得到保证。据统计,用一个含有70000个词的词典去切分含有

15000个词的语料库,仍旧有30%以上的词条没有被分出来,也就

是说有4500个词没有在词典中登录。

第三类是基于统计的方法。基于统计的分词法的基本原理是依据字符

串在语料库中消失的统计频率来打算其是否构成词。词是字的组合,

相邻的字同时消失的次数越多,就越有可能构成一个词。因此字与字

相邻共现的频率或概率能够较好的反映它们成为词的可信度。

最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量

的扫描串,在词典中进行扫描,这是基于词典分词的方法

1.正向最大匹配法

2.逆向最大匹配法

3.最少切分法:使每一句中切出的词数最小,这也是基于词典分词的

方法

条件随机场是一个基于统计的序列标记和分割的方法,属于基于统计

的分词方法范畴。它定义了整个标签序列的联合概率,各状态是非**

的,彼此之间可以交互,因此可以更好地模拟现实世界的数据.

第28题:

28、下列哪个不属于CRF模型对于HMM和MEMM模型的优势()

—27-

A、特征敏捷

B、速度快

C、可容纳较多上下文信息

D、全局最优

28、B

隐马尔可夫模型(HiddenMarkovModel,HMM),最大熠马尔可夫模

型(MaximumEntropyMarkovModel,MEMM)以及条件随机场

(ConditionalRandomField,CRF)是序列标注中最常用也是最基本的

三个模型。

HMM模型是对转移概率和表现概率直接建模,统计共现概率。

MEMM模型是对转移概率和表现概率建立联合概率,统计时统计的

是条件概率,但MEMM简单陷入局部最优,是由于MEMM只在局部

做归一化。

RF模型中,统计了全局概率,在做归一化时,考虑了数据在全局的

分布,而不是仅仅在局部归一化,这样就解决了MEMM中的标记偏

置(labelbias)的问题。

CRF没有HMM那样严格的**性假设条件,因而可以容纳任意的上下

文信息、。特征设计敏捷。(与ME一样)------与HMM比较

同时,由于CRF计算全局最优输出节点的条件概率,它还克服了最大

焙马尔可夫模型标记偏置(Label-bias)的缺点。shy;shy;-----------与

-28―

MEMM比较

CRF是在给定需要标记的观看序列的条件下,计算整个标记序列的联

合概率分布,而不是在给定当前状态条件下,定义下一个状态的状态

分布。

CRF需要训练的参数更多,与MEMM和HMM相比,它存在训练代

价大、简单度高的缺点。

第29题:

29、假设一个完整的扑克牌有52张牌,2黑色(黑葵和梅花)和2

红色(方块和红心)。假如给你一副完整的牌,和半副牌(1红色和1

黑色),则两种状况下抽两种牌都是红色的概率是多少()

A、1/2,1/2

B、25/102,12/50

C、50/51,24/25

D、25/51,12/25

29、B

第一种状况26/52*25/51=25/102

其次种状况13/26*12/25=12/50

-29-

第30题:

30、在二分类问题中,当测试集的正例和负例数量不均衡时,以下

评价方案哪个是相对不合理的()(假设

precision=TP/(TP+FP),recall=TP/(TP+FN)。)

A、Accuracy:(TP+TN)/all

B、F-value:2*recall*precision/(recall+precision)

C、G-mean:sqrt(precision*recall)

D、AUC:曲线下面积

30、A

题目提到测试集正例和负例数量不均衡,那么假设正例数量很少占

10%,负例数量占大部分90%。

而且算法能正确识别全部负例,但正例只有一半能正确判别。

那么

TP=0.05xal

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论