腾讯公司2008年面试试题分析与详解

举报
清雨小竹 发表于 2022/09/25 02:11:39 2022/09/25
【摘要】 试题:1.1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)2.找规律填字母Z  H  AM  E  ()A. KB. YC.&nbs...
试题:
1.1000瓶药水,其中至多有1瓶剧毒,现在给你10只小狗在24小时内通过小狗试药的方
式找出哪瓶药有毒或者全部无毒(小狗服完药20小时后才能判断是否中毒)
2.找规律填字母
Z  H  A
M  E  ()
A. K
B. Y
C. B
D. W
3.网站上的媒体资源(图片、音频、视频等)很容易被盗链,相对比较安全的防范措
施是:()
A 检查refer
B 为资源文件添加数字签名
C 添加基于session的判断
D 以上说法都正确
4.使用视频软件进行聊天时,视频数据几乎都通过udp协议传输。关于udp协议,下列
说法错误的是(  )
A 数据通过udp协议传输存在丢包的可能,安全性不如tcp协议
B udp协议传输执行速度比tcp快
C udp协议的数据传输是无序的,tcp协议的数据传输是有序的。
D 视频、聊天、邮件等数据的传输都可以使用udp协议。
5.局域网甲内的主机A开启了p2p下载工具(如bt,emule等),他如何同局域网乙中的主
机B建立连接______
A 通过主机B的内网ip建立连接
B 通过主机B的物理地址建立连接
C 通过NAT穿越技术建立连接
D 无法建立连接
6.Windows将遵循下面的那种搜索来定位DLL()
1 进程的当前工作目录
2 包含EXE文件的目录
3 列在Path环境变量中的一系列目录
4 Windows系统目录
5 Windows目录
A 12453  B 12543  C 21453  D 21345
7.设有一个递归算法如下
int x(int n)
{
if(n <=3) return 1;
else return x(n-2)+x(n-4)+1;
}
试问计算x(x(8))时需要计算______次x函数
8.至少列举5种windows下进程间通讯的方式
9.不用中间变量,实现strlen函数。(strlen为C语言中求给字符串长度库函数)
int strlen(const char *str)

答案详解(一题多解):
第一题:
关于第一题,同意“时间记录法”,因为这对于信息的记录 过滤 屏蔽或者追查是最有实用性的
第一种:把狗从0-9编号
把药水按1-1000编号
把药水编号按二进制,如果第i位(因为最大1000,所以bit位为0-9)bit位为1,则分给编号为i的狗狗喝
最后得一二进制数,如果编号为i的狗狗死了,该数的第i bit位为1,该数就是有毒的药水编号
对药编号,然后喂狗:
比如:对于药455号:
编号是:111000111(二进制)
然后让第1,2,3,7,8,9狗喝药
就这么喝下去
到最后,肯定有一批狗死掉,假如就是1 2 3 7 8 9死了,那么他们排成的二进制就是毒药:
也就是 111 000 111 = 455 是毒药
第二种:
不过要是从爱护动物的想法来考虑的话 ,我倒是有更好的方法,呵呵,
(1)将小狗从0-9编号,将药瓶1-1000编号。
(2)第0个小时,将药瓶标号百位与小狗标号相同的药喂给小狗,例如 0345喂给3号狗。
(3)第1个小时,将药瓶标号十位与小狗标号相同的药喂给小狗,例如 0345喂给4号小狗。
(4)第2个小时,将药瓶标号个位与小狗标号相同的药喂给小狗,例如 0345喂给5号小狗。
(5)第3个小时,将药瓶标号个位与(小狗标号+1)相同的药喂给小狗,例如 0345喂给6号小狗。
。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。
第20小时死去的狗编号为药品编号百位,
第21小时死去的狗编号为药品编号十位,
第22小时死去的狗编号为药品编号个位,
但是这里有个特殊情况,就是百十个位的重复问题,在第3部我们可以根据剩余9只都安然无事的情况来确定百位与十位的重复,但是当毒药百位与
十位不同时,我们的第4部便只剩下了8只狗,当第四部没有狗死亡时,产生了一个个位到底与百位相同还是与十位相同的不能确定的情况,于是,
我们边等到第23个小时加以确认,
注:当百十个位都为0的情况,便是,第1000只瓶子为毒药。
第三种:
因为给你24小时,20小时才能得出结果,所以可以有4个小时来分别让狗喝药
把1000/(60*4)= 5瓶,
  即如果是一条狗的话每1分钟要喝5瓶,即12S钟喝一瓶,这样时间要掐的很准。如果是在22小时1分钟12秒钟狗才死的,则可以得出是第 
    (2*60*60+1*60+12)/12=606 瓶的有毒
  如果是十条狗,则就可以让每2分钟每只狗和1瓶,只要就时间就比较准确了。
第四种:
我有个答案,只是理论上的,每2.4分钟给一只狗狗喝一瓶药,并记录,若有狗狗中毒,查看时间记录就知道哪瓶药有毒了
第五种:
我觉得这个问题按二进制编号有问题。
应该是二分查找的思想。题目没有限制药水不能掺合,掺合后照样可以毒死狗狗。
1000分为两个500,,对每一分500掺合一下,一份给一只狗狗喝,2小时见分晓。毒死狗狗继续分。最多
11次可以找到有毒的药,用时22小时。没有毒死狗狗,说明有毒的可能在没有喝的500中。
分两分,掺合,一份给一个狗狗喝,一直这样分下去。最终是可以找到有毒的或者都没有毒。
第六种:
因为给你24小时,20小时才能得出结果,所以可以有4个小时来分别让狗喝药
把1000/(60*4)= 5瓶,
即如果是一条狗的话没有1分钟要喝5瓶,即12S钟喝一瓶,这样时间要掐的很准。如果是在22小时1分钟12秒钟狗才死的,则可以得出是第
(2*60*60+1*60+12)/12=606 瓶的有毒
如果是十条狗,则就可以让每2分钟每只狗和1瓶,只要就时间就比较准确了。
首先对小狗进行编号:0-9
然后对药品进行编号(1-100)然后分成10组
然后每组药对应一个编号的狗,没隔24分钟喂一次((24h-20h)*60/10=24min),
然后哪个组的哪个狗狗在什么时候死掉,由于是周期性喂药,然后狗狗中毒的时间是固定的,
根据哪个狗狗在什么时候死亡,就可以算出是哪个编号的药是有毒性的或者没狗狗死亡的话就全部没有毒的.
第二题:
第一种:是不是上面的全是三条线下面的全是四条线
第二种:这题M是这样来的 Z(26) H(8) A(1)
第三种:D(W) 因为第一行是H的各种变形横着的倒着的 所以第二行应该是M的各种变形,E也是侧卧的M,所以应该选择W
第三种:按序号排列:                           按Dec值:                    
选k情况:   Z   H   A   --   >   26  8   1    Z   H   A   --  >   90   72   65                 
           M   E   k   --   >   13  5   11    M   E   k   --   >   77   69   75              
选Y情况:   Z   H   A   --   >   26   8   1          Z   H   A   --   > 90   72   65   
           M   E   Y   --   >   13   5   25         M   E   Y   --   > 77   69   89
选B情况:   Z   H   A   --   >   26   8   1          Z   H   A   --   > 90   72   65 
           M   E   B   --   >   13   5   2          M   E   Y   --   > 77   69   66
选W情况:  Z   H   A   --   >   26   8   1          Z   H   A   --   > 90   72   65 
           M   E   W   --   >   13   5   23         M   E   Y   --   > 77   69   87

只用C选项(B)的数列是递减的,所以选B
不知道这么解答可不可以。
第四种:
M(13) E(3) W(23)
  26-8=14,8-1=7 7*2=14
  23-3和13-3也是二倍的关系

3.网站上的媒体资源(图片、音频、视频等)很容易被盗链,相对比较安全的防范措
施是:( D )
A 检查refer
B 为资源文件添加数字签名
C 添加基于session的判断
D 以上说法都正确
4.使用视频软件进行聊天时,视频数据几乎都通过udp协议传输。关于udp协议,下列
说法错误的是( D )
A 数据通过udp协议传输存在丢包的可能,安全性不如tcp协议
B udp协议传输执行速度比tcp快
C udp协议的数据传输是无序的,tcp协议的数据传输是有序的。
D 视频、聊天、邮件等数据的传输都可以使用udp协议。
5.局域网甲内的主机A开启了p2p下载工具(如bt,emule等),他如何同局域网乙中的主
机B建立连接( C )
A 通过主机B的内网ip建立连接
B 通过主机B的物理地址建立连接
C 通过NAT穿越技术建立连接
D 无法建立连接
解释:
    如果一个NAT接收到一个来自私有网络外面的   TCP   SYN   包,这个包想发起一个“引入”的   TCP   连接,一般来说,NAT会拒绝这个连接请求并扔掉这个SYN   包,或者回送一个TCP   RST(connection   reset,重建连接)包给请求方。但是,有一种情况,当这个接收到的   SYN   包   中的源IP地址和端口、目标IP地址和端口都与NAT登记的一个已经激活的TCP会话中的地址信息相符时,NAT将会放行这个SYN   包,让它进入NAT内部。特别要指出,如果NAT恰好看到一个刚刚发送出去的一个SYN包也和上面接收到的SYN包中的地址信息相符合的话,那么NAT将会认为这个TCP连接已经被激活,并将允许这个方向的SYN包进入NAT内部。    
    如果   Client   A   和   Client   B   能够彼此正确的预知对方的NAT将会给下一个TCP连接分配的公网TCP端口,并且两个客户端能够同时地发起一个“外出”的TCP连接,并在对方的   SYN   包到达之前,自己刚发送出去的SYN包都能顺利的穿过自己的NAT的话,一条端对端的TCP连接就成功地建立了。
    不幸的是,这个诡计比3.4节所讲的UDP端口预言更容易被粉碎,并且对时间的敏感性的依赖更多!首先,除非双方的NAT都是Simple   firewalls   或者都像cone   NAT那样处理TCP通信,否则两个客户端还是无法建立这个TCP直连,因为它们无法预知对方的NAT会分配给新的会话的端口号是多少。   另外,如果双方的   SYN   到达对方的NAT   速度太快(举例来说,就是SYN   A的还未穿过NAT   A时,SYN   B已经提早到达了NAT   A),对方的NAT会将这个SYN扔掉,并返回一个   RST   包,这样就使得这个发快了的一方NAT关闭原来的会话,又重新建立一个新的会话,再利用这个新的会话重发一个SYN,这时端口预言就失效了,因为再次分配到相同的端口地址的几率太小了。    
      最后,尽管在“TCP规范”中说明了“Simultaneous   open”是一种支持的标准技术,但是在一些公共操作系统中,对这种技术的支持并不好。基于这个原因,我们也在这里郑重申明,并不推荐使用这个技术。如果您的应用程序想要穿透NAT并进行高效率高性能的P2P的通信,应该使用UDP技术!

6.Windows将遵循下面的那种搜索来定位DLL( C )
1 进程的当前工作目录
2 包含EXE文件的目录
3 列在Path环境变量中的一系列目录
4 Windows系统目录
5 Windows目录
A 12453  B 12543  C 21453  D 21345
7.设有一个递归算法如下
int x(int n)
{
if(n <=3) return 1;
else return x(n-2)+x(n-4)+1;
}
试问计算x(x(8))时需要计算(18)次x函数。
8.至少列举5种windows下进程间通讯的方式
答:
2 进程通信方法
2.1 文件映射
  文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。
  Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。
  应用程序有三种方法来使多个进程共享一个文件映射对象。
  (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
  (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。
  (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。
  文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
2.2 共享内存
  Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
2.3 匿名管道
  管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
  匿名管道(Anonymous Pipe)是在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。
  匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
2.4 命名管道
  命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
  命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
2.5 邮件槽
  邮件槽(Mailslots)提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。
  通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
  邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。
2.6 剪贴板
  剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
  剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
2.7 动态数据交换
  动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
  DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式:
  (1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
  (2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
  (3) 热链:当数据交换时服务器自动给客户发送数据。
  DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。
2.8 对象连接与嵌入
  应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。
  同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。
2.9 动态连接库
  Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
  虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。
2.10 远程过程调用
  Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。
  由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。
2.11 NetBios函数
  Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。
2.12 Sockets
  Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。
  现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。
2.13 WM_COPYDATA消息
  WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。
9.不用中间变量,实现strlen函数。(strlen为C语言中求给字符串长度库函数)
int strlen(const char *str)
答:系统函数:
int strlen (const char * str)
       {
          int length = 0;
          while( *str++ )
                  ++length;
           return( length );
       }
不用中间变量:
int strlen (const char * str)
       {
          if(*str) return strlen(++str)+1;
          return 0;
       }
int strlen(const char *str)
{
if(str!='\0')
return strlen(++str)+1;
else
return 0;
}

文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。

原文链接:zzzili.blog.csdn.net/article/details/8265325

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。