2015百度校招一面题目分享~

网搜题目,自己找的答。。。。。。。。。。。。。。。。。。。。。。。。。一直在需要补充的过程中~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

简单介绍一下自己,平常用什么语言

1.记得堆和栈的概念吗,指的计算机系统中内存的概念,变量申请的时候,申请在堆上还是栈上?
栈是为执行线程留出的内存空间。当函数被调用的时候,栈顶为局部变量和 一些 bookkeeping 数据预留块。栈通常用后进先出(LIFO)的方式预留空间堆(heap)是为动态分配预留的内存空间。和栈不一样,从堆上分配和重新分配块没有固定模式;你可以在任何时候分配和释放它。 在堆上的变量必须要手动释放,不存在作用域的问题。数据可用 delete, delete[] 或者 free 来释放。堆是在任何内存中动态和随机分配的(内存的)统称;也就是无序的。内存通常由操作系统分配,通过应用程序调用 API 接口去实现分配。在管理动态分配内存上会有一些额外的开销,不过这由操作系统来处理。通常提前分配好了,因为栈必须是连续的内存块。语言的编译器或者操作系统决定它的大小。不要在栈上存储大块数据,这样可以保证有足够的空间不会溢出,除非出现了无限递归的情况。 每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆。 在多线程环境下每一个线程都可以有他自己完全的独立的栈,但是他们共享堆。并行存取被堆控制而不是栈。

对栈而言,栈中的新加数据项放在其他数据的顶部,移除时你也只能移除最顶部的数据(不能越位获取)。

khqDF

  2.对堆而言,数据项位置没有固定的顺序。你可以以任何顺序插入和删除,因为他们没有“顶部”数据这一概念。

E5QTV

  上面上个图片很好的描述了堆和栈分配内存的方式。

2.5堆和栈中的存储内容 
栈:  在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排

操作系统给程序运行的内存非了4个区域:
1 代码区:顾名思义就是存放运行的代码的
2 全局数据区: 存放全局数据和静态数据以及常量.
3 栈区 函数调用时的返回地址,参数压栈,局部变量,返回数据等都存放在栈区.
4 堆区,存放程序动态分配的内存(new,malloc等函数分配的)
栈内存是由系统自己分配和释放的,而堆内存要由程序员自己全全控制的,否则会出现内存泄露
一般认为在c中分为这几个存储区 

1栈 - 有编译器自动分配释放 
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块 
区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 
- 程序结束释放 
4另外还有一个专门放常量的地方。 - 程序结束释放 
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是 
在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态 
区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内 
定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存逻辑上无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。

申请很多变量,导致栈溢出的情况,怎么解决?

1,什么是栈溢出?

因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

2,解决方案:

方法一:用栈把递归转换成非递归

通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必要的数据,以减少系统负担。

 

方法二:使用static对象替代nonstatic局部对象

在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。

 

方法三:增大堆栈大小值

当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。


如果要把某个变量占用的内存保存,怎么解决?

还记得继承和多态的概念吗?都要解释。重载和重写也要解释一下
类就是一类事物的一个抽象
继承可以理解为XX是一种XX,使用extends关键字实现类的机制,通过继承,子类自动拥有基类
多态就是动态绑定,是指在执行期间,而非编译期间判断所引用的对象的实际类型,根据其实际的类型调用其相应的方法。三个必要条件是:要有继承,要有重写,父类引用指向子类对象
解释虚函数和虚函数表

多态性可分为两类:静态多态和动态多态。函数重载和运算符重载实现的多态属于静态多态,动态多态性是通过虚函数实现的。

每个含有虚函数的类有一张虚函数表(vtbl),表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针。

没有虚函数的C++类,是不会有虚函数表的


static关键字,注意不仅要解释静态成员变量,还要解释静态成员函数

1)      静态全局变量

         在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。

静态全局变量的特点:

a. 静态变量(包括静态全局变量和静态局部变量)在全局数据区分配内存;

b. 静态变量,不管静态局部还是静态全局变量只被初始化一次。

c. 未经初始化的静态全局变量会被自动初始化为0或空格。(普通变量即自动变量的值是随机的,除非它被显式初始化)

d. 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见,即其它文件中可以定义相同名称的变量,不会发生冲突

2)     静态局部变量

         在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

         静态局部变量的特点:

a. 该变量在全局数据区分配内存;

   b. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;

   c. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0或空格;

   d. 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

 

         3)      静态函数

         在函数的返回类型前加上static关键字,则该函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其他文件使用。



堆排序的算法复杂度?快排序算法复杂度?快排过程?其收敛条件是什么?快排是稳定的吗?有可能改造成稳定的吗?

你有一台机器,这个机器的剩余内存只有2兆,电脑上存了20000个float,需要把这些float排序,你会怎么做?

顺便问了一下归并怎么排序?归并复杂度?

假设有一个锅炉,同时有一台测试仪,给锅炉每秒测试一次温度,把温度记录下来,整套设备持续运行若干年,为了安全,这个测量仪必须把这个锅炉曾经到达的1000个最高值记录下来,但测量仪本身内存不是很大没法把所有数值都记下来,如果要你设计一个系统,记录最高的1000值.需要跟已知的数值比较,需要比较多少次?

二分法比较并不科学,首先和上一次的最小值比较

链表,判断是否有环

两个链表,判断是否相交

对搜索引擎有什么了解?

找一个比较典型的项目了解一下

甲、乙两个人背对背坐着,乙面前有4*4的格子,上面有象棋,有正面和背面,规则是:甲可以命令乙进行一次操作。该操作可以是翻转棋子(可以任意翻1颗,也可以翻任意2颗,翻任意3颗的情况和1颗一样不考虑),该操作也可以是旋转棋盘(旋转90°180°270°),但每次只能选择一种操作。
当棋盘上4颗棋子同时在正面,或者同时在背面,则甲赢。
问:最少几次能保证甲一定能赢?

聊一下项目,大项目小项目

说一下一两种你比较熟悉的分类器,比较一下优缺点
机器学习的一些。既然下一问要用到优缺点,那最好比较一对有一些关联性的分类器,比如ID3和c4.5
遇到内存泄露问题,一般会采取什么过程去找原因,专门针对内存泄露来
栈和堆。静态变量,静态成员函数

在线写程序:对字符串进行处理,字符串里面有连续的空格,写一个函数,去掉多余空格

有一块内存buffer,统计一下多少个二进制的byte是1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值