2023年近两年科大讯飞实习生笔试面试题_第1页
2023年近两年科大讯飞实习生笔试面试题_第2页
2023年近两年科大讯飞实习生笔试面试题_第3页
2023年近两年科大讯飞实习生笔试面试题_第4页
2023年近两年科大讯飞实习生笔试面试题_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

第一题是递归判断五子棋问题,在一个棋盘上,0代表空,1代表黑子,2代表白子,现给定一个坐标(ax,ay),代表当前下的黑子的位置,求递归判断黑子是否已经赢了(不考虑赢的趋势,也即仅仅判断当前状态)然后就是问如何求1到1000000内所有素数,(相信弄过一点算法都清楚筛选法)最后问了个如何在一个序列中求第k大的数,笔者当时脑袋一热回答了二叉搜索树+优先级(也OK),面试官听完后就来了句,不就是堆嘛。。。1.已知二叉树的前序遍历为ABCDEFGHIJ,中序遍历为CBEDAHGIJF,请画出其二叉树结构。2.求一个整数数组的最大元素,用递归方法实现。<span>#include

<iostream>

#include

<cmath>

using

namespace

std;

int

maxnum(int

a[],

int

n)

if(n

==

1)

return

a[0];

if(n>1)

{

return

max(a[0],

maxnum(a+1,n-1));

}

}

int

main()

{

int

num[10]

=

{0,1,2,3,4,5,6,7,8,9};

cout<<maxnum(num,10)<<endl;

return

0;

3.什么是虚拟存储器?虚拟存储器的特点是什么?虚拟存储器:在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。虚拟存储区的容量与物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。特点:多次性、对换性、虚拟性。多次性是指一个作业被提成多次调入内存运营,亦即在作业运营时没有必要将其所有装入,只需将当前要运营的那部分程序和数据装入内存即可;以后每当要运营到尚未调入的那部分程序时,再将它调入。对换性是指允许在作业的运营过程中进行换进、换出,亦即,在进程运营期间,允许将那些暂不使用的程序和数据,从内存调至外村的对换区(换出),待以后需要时再将它们从外存调至内存(换进)。虚拟性是指可以从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。4.什么是this指针?其重要功能是什么?

this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。全局仅有一个this指针,当一个对象被创建时,this指针就指向对象数据的首地址。

一种情况就是,在类的非静态成员函数中返回类对象自身的时候,直接使用return*this;此外一种情况是当参数与成员变量名相同时使用this指针,如this->n=n(不能写成n=n)。7.写出字符串类的必备构造函数和赋值运算符重载的实现方法。已知类String的原型为:classString{public:String(constchar*pStr=NULL);//默认构造函数~String(void);//析构函数String&operate=(constString&Source);//重载赋值运算符private:char*m_pData;//指向字符串的指针};8.已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边。规定期间复杂度为O(n)。<span>void

partition(int

A[],

int

n)

{

int

x;

int

i

=

0;

int

j

n-1;

while(i

!=

j)

{

while(

a[i]%2

==

1)

i++;

while

(a[j]%2

==

0)

j++;

if(i

<

j)

{

x

=

a[i];

a[i]

=

a[j];

a[j]

=

x;

}

}1产生死锁的四个必要条件a互斥使用(资源独占)一个资源每次只能给一个进程使用b资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放c请求和保持(部分分派,占有申请)一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分派)d循环等待存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程2不大于N的所有质数publicclassGetPrime{publicstaticbooleanisPrime(intnum){for(inti=2;i<=Math.Sqrt(num):i++){if(num%i==0){returnfalse;}}returntrue;}publicstaticvoidmain(String[]args){for(inti=2;i<=N;i++){if(isPrime(i)){System.out.println(i+"isaPrime");}} }3共享内存,管道,文献,socket传输的优缺陷Linux进程间通信linux下进程间通信的几种重要手段简介:管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。信号(Signal):信号是比较复杂的通信方式,用于告知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程自身;linux除了支持Unix初期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(事实上,该函数是基于BSD的,BSD为了实现可靠信号机制,又可以统一对外接口,用sigaction函数重新实现了signal函数);报文(Message)队列(消息队列):消息队列是消息的链接表,涉及Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺陷。共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运营效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达成进程间的同步及互斥。信号量(semaphore):重要作为进程间以及同一进程不同线程之间的同步手段。套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。由于要考虑跨平台,一方面砍掉一批(关于IPC的跨平台问题,我在“跨平台开发”系列中会提到)。剩下的IPC类型中,可以进行数据传输的IPC就不多了,重要有如下几种:套接字(以下简称Socket)、共享内存、管道、文献。其中Socket是我强烈推荐的IPC方式,理由如下:使用Socket可以天然地支持分布式部署;使用Socket可以比较容易地实现多种编程语言的混合(比如C++、Java、Python、Flex都支持Socket);使用Socket还可以省掉了一大坨“锁操作”的代码。列位看官中,或许有人在紧张Socket的性能问题,其实大可不必多虑。当两个进程在本机上进行Socket通讯时,由于可以使用localhost环回地址,数据不用通过物理网卡,操作系统内核还可以进行某些优化。这种情况下,Socket相对其它几种IPC机制,不会有太大的性能偏差。最后再补充一下,Socket方式也可以有效防止扯皮问题。举个例子:张三写了一个进程A,李四写了一个进程B,进程A通过Socket方式发数据给进程B。忽然有一天,两个进程的通讯出故障了。然后张三就说是李四接受数据犯错;李四就说张三发送数据犯错。这时候怎么办捏?很简朴,随便找个Sniffer软件当场抓一下数据包并Dump出来看,问题就水落石出了。4、TCP/IP建立连接过程在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完毕三次握手。式查询创建视图.查询只从包含查询所需数据的远程服务器的表中读取所需的数据.被分布式查询引用的其他服务器,在视图中都将不会被访问.6、题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:StructListNode{intm_nKey;ListNode*m_pNext;};ListNode*ReverseIteratively(ListNode*pHead){ListNode*pReversedHead=NULL;ListNode*pNode=pHead;ListNode*pPrev=NULL;while(pNode!=NULL){//getthenextnode,andsaveitatpNextListNode*pNext=pNode->m_pNext;//ifthenextnodeisnull,thecurrectistheendoforiginal//list,andit'stheheadofthereversedlistif(pNext==NULL)pReversedHead=pNode;//reversethelinkagebetweennodespNode->m_pNext=pPrev;//moveforwardonthethelistpPrev=pNode;pNode=pNext;}returnpReversedHead;}7、输入xyz,然后输出序列的也许性XYZXZYYXZYZXZYX8、怎么用一个类将一个实例完全复制给此外一个实例填空题有STL库由哪部分组成,ﻫ简答题:1.冒泡排序和快速排序的优缺陷

2.进程和线程共同使用的技术(仿佛是这么说的)

3.指针和引用的区别ﻫ

4.析构函数和普通成员函数的区别3.实现一个字节中空格个数不能超过一个,例如a--b-c应当输出a-b-c,此处-代表空格//trim

a

string

by

make

more

than

one

blank

to

one

blank

char*

trim(char*

a)

{

int

i=-1,j=0;

for

(;a[j]!='\0';j++)

{

if

(a[j]==a[j+1]

&&

a[j+1]=='

')

{

//skip

more

than

one

blank

while

(a[j]=='

')

{

++j;

--j;//

go

back

to

the

last

blank

a[++i]=a[j];

}

a[++i]='\0';

return

a;

}

int

main(

void

)

{

char

a[100]="a

c

e

f";

print(a);

print(trim(a));

return

0;

}

第二部分:填空题(2*6)1.操作系统中的存储管理常用(虚拟存储器)的方式来摆脱主存容量的限制。2.满二叉树第i层上的叶子节点数有(2的i-1次方)个。3.二分查找算法的平均时间复杂度是(logn)。4.设x=3,y=2,x<<y=(12)。5.非成员函数应声明为类的(友元函数)才干访问这个类的private成员。6.带有(纯虚函数)的类称为抽象类,它只能作为基类来使用。第三部分:简答题(3*6)1.列举你所知道的排序算法和他们的平均时间复杂度。直接插入排序o(n*n)希尔排序o(nlogn)冒泡排序o(n*n)快速排序o(knlogn)直接选择排序o(n*n)堆排序o(nlogn)归并排序o(nlogn)2.列举析构函数与普通类成员函数的不同点。析构函数无返回类型,前面有标志符~,系统自动调用的。普通成员函数有返回类型,需要显式调用。3.在c++语言中使用宏定义经常会引起一下错误(如少打括号引起表达式值与预期不符等),列举一些可以替代宏定义的方法。const定义常量inline函数typedef定义别名第四部分:编程题1.裴波那絜数列的形式如下:11235813…….n,编写一个函数计算数列中第n个元素的值。intFibonax(intn){if(n==1||n==2)return1;elsereturnFibonax(n-1)+Fibonax(n-2);}2.不调用任何系统函数,实现在一个字符串中查找子串的函数,假如包含子串,则返回该子串的位置值。(7分)intGetCommon(char*s1,char*s2,intloca){intlen1=strlen(s1);intlen2=strlen(s2);for(inti=0;i<len1;i++){if(s1[i]==s2[0]){intas=i,bs=0,count=1;while(as+1<len1&&bs+1<len2&&s1[++as]==s2[++bs])count++;if(count==len2){loca=i;returnloca;}}}}3.用算法实现将一个输入的数字颠倒,规定不调用任何系统函数,也不能将输入数字转换为字符串作为中间过渡。(8分)方法1:(字符数组,借鉴#include<stdio.h>#include<string.h>#include<dos.h>intmain(){charstr[]="ABCD1234efgh";intlength=strlen(str);char*p1=str;char*p2=str+length-1;while(p1<p2){charc=*p1;*p1=*p2;*p2=c;++p1;--p2;}printf("strnowis%s\n",str);system("pause");return0;}方法2:递归或栈voidreverse(){stacks;intx;while(cin>>x){s.push(x);}while(!s.empty()){x=s.pop();cout<<x;}}一、单选题2、有一盆衣服(已经洗过了,需要漂洗),请问在漂洗次数固定的情况下如何分派水才干把衣服洗得最干净(C) A、从少到多 B、从多到少ﻩC、平均分派,是求函数极值问题 D、随便洗3、用力拉一根橡皮筋,橡皮筋上有没有点还处在本来的位置没有被拉走(B)ﻩA、有ﻩﻩ ﻩB、没有ﻩC、有是有、有时没有 D、一般人拉没有,刘谦拉就有4、假设一个应用程序需要使用多个提供不同功能但在皆接口上有差异的类,适合使用的设计模式是(D(拟定)) A、装饰模式 ﻩB、迭代器模式装饰模式是在不必改变原类文献和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。迭代器模式是一种HYPERLINK"(%E8%AE%A1%E7%AE%97%E6%9C%BA)"\o"设计模式(计算机)"设计模式,是一种最简朴也最常见的设计模式。它可以让使用者透过特定的接口巡访容器中的每一个元素而不用了解底层的实作。ﻩC、工厂模式 D、适配器模式5、结构化程序设计重要强调的是(C) A、程序的规模 B、程序的效率 C、程序的易读性ﻩ D、程序设计语言的先进性6、SQLServer中,删除一个表的命令是(C)ﻩA、DELETEﻩB、CLEARﻩﻩC、DROPﻩ D、REMOVVE7、以下关于互斥量说法错误的是:(B)ﻩA、单线程程序不需要使用互斥量ﻩB、互斥量可以被两个以上的线程锁定ﻩC、互斥量的激活是原子操作ﻩD、互斥量的创建和销毁可以在不同的线程进行8、在Windows任务管理器中发现某个进程CPU占用率长时间处在100%,以下也许导致该现象的因素是(D) A、程序处在大量I/O过程中ﻩﻩB、多线程导致进程死锁 C、等带另一个程序响应 ﻩ D、程序进入死循环9、假设进程中一个生产者线程,10个消费者线程,为保证进程间不出现死锁,信号量的初值可以设立为(C)ﻩA、-1ﻩ B、0ﻩC、1 ﻩD、1010、使用两个栈共享一片空间时,当(D)时,才产生溢出 A、其中一个栈的栈底到达这片内存空间的中心点ﻩB、其中一个栈的栈顶到达这片内存空间的中心点ﻩC、两个栈均不空,且一个栈的栈顶到达另一个栈的栈底(不也许发生这种情况) D、两个栈的栈顶在这片内存空间的某一位置相遇11、在一个单链表HL中,若要在指针所指节点的后面插入一个有指针second所指向的节点,则执行(A)ﻩA、second->next=first->next;first->next=second;ﻩB、first->next=second->next;second=first;ﻩC、second->next=first->next;second->next=first; D、first->next=second->next;second->next=first;12、以下C语言编译过程的真确环节是(B)ﻩA、预解决编译汇编连接 B、预解决编译优化(不能少了优化)汇编连接ﻩC、编译优化汇编运营 ﻩD、编辑预解决编译汇编优化运营13、在C语言程序编译时出现如下错误: “errorLNK2023:unresovedexternalsymbol"int__cdecltest(int)"(?test@@YAHH@Z)ﻩreferenced”也许的因素是(D)ﻩA、函数未定义 B、变量未声明 C、变量未定义 D、函数未声明14、下列关于C语言中的函数叙述错误的是(B)ﻩA、一个函数中可以有多条return语句ﻩB、调用函数必须要在一条独立的语句中完毕 C、函数可以通过return语句传递函数值ﻩD、主函数main可以带有参数15、在C语言中,打开可读写的二进制文献myfile并向该文献追加写入内容,假如myfile不存在则创建新文献,对的的调用方式为() A、fopen("myfile","w")ﻩﻩB、fopen("myfile","wb")ﻩC、fopen("myfile","r+b") ﻩD、fopen("myfile","a+b")a表达追加文献内容。16、在C语言中,一个shortint型数据在内存中占2字节,则shortint型数据的取值范围(B) A、-256~255ﻩ B、-32768~32767 C、-65536~65535ﻩ D、--17、下面是对数组s的初始化,其中不对的的是(D) A、chars[6]={"abcd"}; B、chars[6]={'a','b','c','d'}ﻩC、chars[6]=""ﻩ; D、chars[6]="abcdef"18、有以下一段程序代码: voidGetMemory(char**p,intnum)ﻩ{ *p=(char*)malloc(num);ﻩ}ﻩvoidTest(void) { char*str=NULL; ﻩGetMemory(&str,100);ﻩﻩstrcpy(str,"hello");ﻩﻩprintf(str);ﻩ} 请问运营Test函数会有什么样的结果(A) A、helloﻩ B、无效指针,输出不拟定 C、NUllﻩ D、程序崩溃19、在32位系统中,有一类:ﻩclassAﻩ{ﻩﻩpublic: ﻩvirtualinttest();ﻩﻩﻩvirtualdoubletest2(); ﻩ inttest3();ﻩﻩprotected:ﻩﻩ doubletest4();ﻩ private: ﻩ inta,b,c;定义了三个变量,加上一个虚函数表指针。大小为16ﻩ};ﻩ请问sizeof(A)=(B)ﻩA、12 B、16ﻩ

成员变量+虚函数表指针(4个字节,多个虚函数也只有一个该指针)。则所有的虚函数保存在虚函数表中,然后类中会有一个指针指向该表;这个指针需要占用空间,所以需要+4;空类的大小为1.20、有以下一段程序代码:ﻩclassAﻩ{ﻩﻩpublic: ﻩﻩvirtualvoidfunc1(){printf("A'sfuncl");} voidfunc2(){("A'sfunc2")};ﻩ}ﻩclassB:publicAﻩ{ public:ﻩ ﻩvirtualvoidfunc1(){printf("B'sfuncl");}ﻩﻩ voidfunc2(){("B'sfunc2")};ﻩ}ﻩvoidmain()ﻩ{ ﻩBinst_b;ﻩﻩB*ptr_a=&b;ﻩ ptr_a->func1();ﻩﻩptr_a->func2(); }ﻩ程序的输出结果为:(C)ﻩA、A'sfunclB'sfunc2ﻩB、B'sfunclA'sfunc2ﻩC、B'sfunclB'sfunc2ﻩD、A'sfunclA'sfunc2二、填空题1、操作系统中的存储管理常用__虚拟存储器__的方式来摆脱主存容量的限制。2、满二叉树第i层上的叶子节点数有_2^(i-1)___个。3、二分查找算法平均时间复杂限度是___o(log(n))_____。4、设x=3,y=2,x<<y=___12___。5、非成员函数声明为类的__友元函数_____才干访问这个类的private成员。6、带有____纯虚函数____的类称为抽象类,它只能作为基类来使用。三、简答题(每题6分,共18分)1、列举你所知道的排序算法和它们的平均复杂限度。 答:1、冒泡排序(bubblesort)—O(n^2)ﻩﻩ2、鸡尾酒排序(Cocktailsort,双向的冒泡排序)—O(n^2)ﻩﻩ3、插入排序(insertionsort)—O(n^2) ﻩ4、选择排序(selectionsort)—O(n^2) ﻩ5、堆排序(heapsort)—O(nlogn) 6、快速排序(quicksort)—O(nlogn)快速排序:(基于划分即分治的的思想,就是选择一个基准,使得左边小于基准,右边大于基准)希尔排序:选择你一个增量,不断递减来排序。基数排序:对于整数,按照个位,十位,百位来排序O(dn)桶排序:工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有也许再使用别的HYPERLINK""\o"排序算法"排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是HYPERLINK""\o"鸽巢排序"鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分派的时候,O(n)各种排序的方式2、列举析构函数与普通类成员函数的不同点。 答:1、析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~stud() 2、它不能带任何参数,也没有返回值(涉及void类型)。3、只能有一个析构函数,不能重载4、析构函数在对象生存期即将结束的时刻被自动调用3、在C++语言中使用宏定义经常会引起一些错误(如少打括号引起表达式值与预期不符等),列举一些可以代替宏定义的方法。内联函数从HYPERLINK""\t"_blank"源代码层看,有函数的结构,而在编译后,却不具有函数的性质。编译时,类似宏替换。Method1:内联函数,Method2:const方法Method3:typedef方法。四、编程题(共三题20分)斐波那契数列的形式如下:1,1,2,3,5,8,13……,n,编写一个函数计算数列中第n个元素的值。(5分)(1)、C语言程序实现ﻩﻩ#include<stdio.h>intfeibo(intp){ﻩﻩ if(p>2)ﻩ ﻩreturnfeibo(p-1)+feibo(p-2);ﻩ ﻩelseﻩ return1;}voidmain(){ﻩ inti,n;ﻩﻩﻩlongintsum=0;ﻩ ﻩscanf("%d",&n);ﻩﻩﻩsum=feibo(n-1)+feibo(n-2); ﻩ printf("%d\n",sum);}(2)、C++语言实现#include<iostream>usingnamespacestd;intfib(intn){ﻩcout<<"Processingfib("<<n<<")...";ﻩif(n<3) {retu

温馨提示

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

评论

0/150

提交评论