区块链技术博客
www.b2bchain.cn

面试笔试题整理

这篇文章主要介绍了面试笔试题整理,通过具体代码讲解8221并且分析了面试笔试题整理的详细步骤与相关技巧,需要的朋友可以参考下

本文实例讲述了面试笔试题整理。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/8221.html。具体如下:

面试笔试题整理

1、乘客在公交车站等车,有两路公交车A和B,A车十分钟一趟,B车五分钟一趟,两种车没有任何相关性,求顾客的平均等待时间。

(1)每5分钟来辆A车,每10分钟来辆B车,平均下来每10分钟可来3辆车,于是平均等待时间为10/3=3分20秒。 (2)概率密度的方法,不赘述。

2、有一个字符串s,和一个哈希表m,哈希表包含一些单词。判断字符串能不能被哈希表里边的单词完全分割。例如string s = “dogandcat”,m=[dog, and, cat],s可以被m完全分割。但如果s1=”qwerfda”,就不行。

3、介绍一下TCP四次挥手

因为TCP连接是全双工通信,断开连接时,两边都需要发送FIN并回发ACK。

4、堆和栈的区别是什么?

栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。在Windows下,栈是向低地址扩展的数据结 构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是 一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。堆是向高地址扩展的数据结构,是不连续的内存区域。windows和linux对堆的管理方式可能完全不一样。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

在C++中,内存分成5个区,他们分别是堆(new)、栈、自由存储区(malloc)、全局/静态存储区和常量存储区。

5、进程切换的时候操作系统会做哪些事情?

6、进程之间的通信方法都有哪些?

7、死锁的条件

8、网络调用里的select和epoll

9、大概说一下OOP的多态机制。

10、C++里的多态怎么实现的

(主要是虚函数相关的内容)

11、用两种方式将.π、65536、”ABCDEFG”这三个值连续写到磁盘文件上,一种是文本方式,一种是二进制方式,问文件的大小分别是多少。

12、乐观锁、悲观锁

这两兄弟是针对向数据库写数据来说的。一般写数据的过程是读出数据,处理后再写进去。

对于乐观锁来说,读出时判断数据版本号,写入时再判断数据版本号有没有变。一般是在应用程序层面实现的。

对于悲观锁来说,从读出时就锁上数据,防止其他人写数据,其他读数据的请求需要等待,写入后放开锁。

13、蓄水池抽样

https://blog.csdn.net/huagong_adu/article/details/7619665

我们总是选择第一个对象,以1/2的概率选择第二个,以1/3的概率选择第三个,以此类推,以1/m的概率选择第m个对象。当该过程结束时,每一个对象具有相同的选中概率,即1/n。

14、读者写者问题

https://blog.csdn.net/cz_hyf/article/details/4443551

模型:

有一些读者线程和写者线程要访问资源。

要求:

临界区内读写互斥,写写互斥。

额外知识:

记录型信号量semaphore的wait操作(P操作)和signal操作(V操作)是原子化操作。

wait操作是指如果信号量的值等于0,那么等待,直到信号量变回正数,就给它减1,继续执行后面操作。

signal操作是指信号量加1。

方案:

(1)读者优先:有读者进入临界区后,阻塞写者进入;有写者进入临界区后,阻塞读者和写者进入。

 semaphore fmutex=1, rdcntmutex=1; //fmutex --> access to file; rdcntmutex --> access to readcount int readcount = 0; //每个读者线程跑这个函数 void reader(){     while(1){         wait(rdcntmutex);         if(0 == readcount)wait(fmutex);         readcount = readcount + 1;         signal(rdcntmutex);          //Do read operation ...          wait(rdcntmutex);         readcount = readcount - 1;         if(0 == readcount)signal(fmutex);         signal(rdcntmutex);     } } //每个写者线程跑这个函数 void writer(){     while(1){         wait(fmutex);         //Do write operation ...         signal(fmutex);     } } 

(2)写者优先:增加个队列。写者进入队列时会阻塞后面读者进入队列,等待此时临界区所有读者读完后写者一个一个进入临界区。如果队列里没有写者后,允许读者进入。

 semaphore fmutex=1, rdcntmutex=1, wtcntmutex=1, queue=1; //fmutex --> access to file; rdcntmutex --> access to readcount //wtcntmutex --> access to writecount int readcount = 0, writecount = 0; void reader(){     while(1){         wait(queue);         wait(rdcntmutex);         if(0 == readcount)wait(fmutex);         readcount = readcount + 1;         signal(rdcntmutex);         signal(queue);         //Do read operation ...         wait(rdcntmutex);         readcount = readcount - 1;         if(0 == readcount)signal(fmutex);         signal(rdcntmutex);     } } void writer(){     while(1){         wait(wtcntmutex);         if(0 == writecount)wait(queue);         writecount = writecount + 1;         signal(wtcntmutex);         wait(fmutex);         //Do write operation ...         signal(fmutex);         wait(wtcntmutex);         writecount = writecount - 1;         if(0 == writecount)signal(queue);         signal(wtcntmutex);     } } 

从实现上来说,增加了queue信号量,写者队列有成员就会一直占着queue信号量。读者如果想要进入读者队列(即让readcount自增),需要获得queue信号量。

(3)公平竞争:写者进入队列时会阻塞后面读者和写者进入队列。等此时临界区所有读者读完后,队列里唯一一个写者进入临界区。然后队列就可以再随机进读者或者写者。

 semaphore fmutex=1, rdcntmutex=1, queue=1; //fmutex --> access to file; rdcntmutex --> access to readcount int readcount = 0; void reader(){     while(1){         wait(queue);         wait(rdcntmutex);         if(0 == readcount)wait(fmutex);         readcount = readcount + 1;         signal(rdcntmutex);         signal(queue);         //Do read operation ...         wait(rdcntmutex);         readcount = readcount - 1;         if(0 == readcount)signal(fmutex);         signal(rdcntmutex);     } } void writer(){     while(1){         wait(queue);         wait(fmutex);         signal(queue);         //Do write operation ...         signal(fmutex);     } } 

15、进程同步的几种方式

信号量:一般是记录型信号量 管程:管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块。在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。 消息传递:源进程通过send(destination,message)发送消息,目的进程通过receive(source,message)接收消息。

网络整理。

本文地址https://www.b2bchain.cn/8221.html

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 面试笔试题整理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们