面经中高频知识点归纳(六)

1.通常递归所采用的数据结构?递归和循环的区别?

->采用的数据结构为:栈

->(1)递归算法与循环算法的设计思路区别在于:

函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法。

(2)递归其实是方便了程序员难为了机器。优点就是易理解,容易编程。但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算

法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。

循环其缺点就是不容易理解,编写复杂问题时困难。优点是效率高。运行时间只因循环次数增加而增加,没什么额外开销。空间上没有什么增加。

局部变量占用的内存是一次性的,也就是O(1)的空间复杂度,而对于递归(不考虑尾递归优化的情况),每次函数调用都要压栈,那么空间复杂度是O(n),和递归次数呈线性关系。

(3)递归程序改用循环实现的话,一般都是要自己维护一个栈的,以便状态的回溯。原理上讲,所有递归都是可以消除的,代价就是可能自己要维护一个栈。而且我个人认为,很多情况下用递归还是必要的,它往往能把复杂问题分解成更为简单的步骤,而且很能反映问题的本质。

2.A,B,C,D四个进程,A向一个缓冲区写数据,B,C,D从该缓冲区读数据,A要等到B,C,D都已经读好才能写下一个。用p,v操作实现通讯。

设置五个信号量。缓冲区是否正在被使用信号量:S=1(初值,下同);B有数据可读:bs=0;C有数据可读:cs=0;D有数据可读:ds=0;另外增加一个全局变量SA=3,表示b、c、d均读完。

3.补码:写出0,-1,-5的二进制补码

在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法

来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

求给定数值的补码表示分以下两种情况:

(1)正数的补码:与原码相同.【例1】+9的补码是00001001。

(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1.

0的补码是00000000
-1的补码是11111111
-5的补码是10000110

4.DNS的原理

DNS分为Client和Server,Client扮演发问的角色,也就是问Server一个Domain Name,而Server必须要回答此Domain Name的真正IP地址。而当地的DNS先会查自己的资料库。如果自己的资料库没有,则会往该DNS上所设的的DNS询问,依此得到答案之后,将收到的答案存起来,并回答客户。为了加快速度,通常将常用的域名地址存在就近的dns服务器的高速缓存区。这样可以提高速度。

5.项目开发:软件流程,瀑布模型;黑盒测试

->软件开发流程
需求说明,
结构化分析,结果需要得到系统的数据流图,数据字典和加工处理说明
总体设计,
详细设计
软件生存周期包括
可行性分析与项目开发计划,需求分析,概要设计,详细设计,编码,测试,维护等活动

软件生存周期的模型

瀑布模型:各活动依线性顺序连接,适合于软件需求很明确的软件项目

演化模型:先够造一个初始运行版本(原型),然后根据用户使用中的建议不断的改进,获得最终软件产品的过程。适用于对软件需求缺乏准确认识的情况

螺旋模型:将瀑布模型和演化模型结合起来,加入了两种模型均忽略的风险分析,将开发过程分为几个螺旋周期,每个螺旋周期大致和瀑布模型符合,每个周期用户评估结束后在进入下一个周期的开发计划。

喷泉模型:克服了瀑布模型不支持软件重用和多项开发活动集成的局限性,它开发过程中具有迭代性和无间隙性,迭代意味着模型中的开发活动常常需要重复多次,迭代过程中不断的完善,开发活动间没有明显的界限,交叉迭代进行,以用户需求为动力,以对象作为驱动的模型。适合于面向对象的开发方法。

测试:
软件测试的策略
有效的软件测试实际上分成4步进行:
1)单元测试
2)集成测试
3) 确认测试
4) 系统测试
测试方法
静态测试,动态测试
测试用例的设计
(1)用黑盒法(又叫功能测试或数据驱动测试)设计测试用例
等价类划分,边值分析,错误猜测和因果图等
(2)白盒测试(又称为结构测试或逻辑驱动测试)
逻辑覆盖
循环覆盖
基本路径测试

6.全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的

全局变量和局部变量的区别是作用域不同,全局变量从定义位置开始到程序结束,而局部变量只限定义的函数内可使用,全局变量在数据段,而局部变量在栈,局部变量在函数结束时内存空间就被系统收回,所以要返回的数组或字符串不要用局部变量定义.extren和在main()函数外定义的变量都称为全局变量,操作系统和编译器从定义变量为变量分配内存时,从变量的定义和存储区域来分别局部变量和全局变量.

编译器通过语法词法的分析,判断出是全局变量还是局部变量。如果是全局变量的话,编译器在将源代码翻译成二进制代码时就为全局变量分配好一个虚拟地址 (windows下0x00400000以上的地址,也就是所说的全局区),所以程序在对全局变量的操作时是对一个硬编码的地址操做。局部变量的话,编译时不分配空间,而是以相对于ebp或esp的偏移来表示局部变量的地址,所以局部变量内存是在局部变量所在的函数被调用时才真正分配。以汇编的角度来看:函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存,另外局部变量可以直接分配在寄存器中。操作系统通过变量的分配地址就可以判断出是局部变量和全局变量。

7.C++ 的类和C++里面的struct有什么区别? 

C++中的struct扩充了C的struct功能,其实它还拥有class的其他特性,例如继承、虚函数等。区别在于:

关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。
关于继承方式
class继承默认是private继承,而struct继承默认是public继承。
另外,在C++模板中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。

->C++中保留struct的关键字是为了使C++编译器能够兼容C开发的程序。

补充:C是一种过程化的语言,struct只是作为一种复杂数据类型定义,struct中只能定义成员变量,不能定义成员函数。

8.

时间: 2024-10-07 05:22:53

面经中高频知识点归纳(六)的相关文章

面经中高频知识点归纳

网易面经知识点(C++/C研发) 注:由阅读大牛面经整理而成!主要是夯实基础块! 1.多态性都有哪些? C++中的多态(虽然多态不是C++所特有的,但是C++中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态:发生在运行期的则是动态绑定,也就是动多态.静多态可以通过模板和函数重载来实现(之所说C++中的多态主要还是因为模板这个东西),下面举两个例子:1)函数模板template

面经中高频知识点归纳(五)

求职季真真切切的来啦,继续整理一些高质量的面经,查查漏补不缺吧!fighting! 不熟悉的地方: 1.tcp粘包分析 2.管道,消息队列,共享内存! 进程间通信       有用过管道吗      是单向还是双向     可以双向吗? 进程间通信和线程间通信 <现代操作系统>读书笔记之——进程间通信 面经:腾讯求职经历 计算机网络相关 1 TCP三次握手.四次挥手2 TCP滑动窗口机制3 TCP拥塞控制机制4 socket模型 C/C++相关 1 虚析构.模板和宏2 虚函数实现机制3 vec

2016年初中数学知识点中考总复习总结归纳

2016年初中数学知识点中考总复习总结归纳 http://wenku.baidu.com/link?url=NbEiI_Ld2TO3zEH8d5oDxTux2IBWJ5HqNmZ467MGchJTV2G0pyG4_TauOsYhjL6Ybyqp8MxUKM_wtofUqMTc7ePR3gJv3zIY27sTuSGOaRW

【路线篇(二)】知识点归纳

[喵"的Android之路][路线篇(二)]知识点归纳 参考:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对象编程 1 Java数据类型与运算符 2 String和StringBuffer的使用.正则表达式 3 我给面向对象的抽象,封装,继承,多态,类与对象,对象初始化和回收:构造函数.this关键字.方法和方法的参数传递过程.static关键字.内部类,Java的垃极回收机制,Javadoc介绍 4 对象实例

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类                                                                 --转载请注明出处:coder-pig 本节引言: 兜兜转转,又回来写Java了,上一篇J2SE知识点归纳笔记(六)---Java常用类是上2014.4.14写的,时隔一年 又来重拾之前还没写完的系列了,前些天群里一个妹子反映她Java基础薄弱,然后抱怨在cs

索引知识点归纳总结

1. 聚集索引 聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的为整张表的行记录数据.也将聚集索引的叶子节点称为数据页.同B+树数据结构一样,每个数据页都通过一个双向链表进行链接. 由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引.在多数情况下,查询优化倾向于采用聚集索引.因为聚集索引能够在B+树索引的叶子节点直接找到数据.另外,由于定义了数据的逻辑顺序,聚集索引能够特别快的访问针对范围的查询. 聚集索引的存储并不是物理

Java的21个技术点和知识点归纳

1. JVM相关(包括了各个版本的特性) 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可.不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的. JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透.我在面试有超过3年Java经验的开发者的时候, JVM几乎就是一个必问的问题了.当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低. 在JVM这个大类

给Java新手的一些建议——Java知识点归纳(Java基础部分)

写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的.和Java中各个框架相关的内容. 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容. 1. JVM相

给Java新手的一些建议----Java知识点归纳(Java基础部分)

写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的.和Java中各个框架相关的内容. 经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容. 1. JVM相