那些我面过的试

面试经验总结

7月5号中兴提前批技术面+综合面:

1、技术面项目问题没问什么,只问了QT什么语言编写,适用于哪个平台?主要针对研究方向问了很多。为什么不按老师的培养计划走?

2、综合面令人印象深刻,首先自我介绍,然后问为什么选择软件开发,工作地点的考量,你怎么评价自己(我好像中了雷区,说自己温吞,企业应该希望招到有上进心的、积极的人)重要的是问了2个专业问题,

  • question 1、 hashmap的底层构造了解不?(只回答上来了是利用键值寻找)

  • -hash_map基于hash table(哈希表)。 哈希表最大的优点,就是把数据的存储 和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。
    其基本原理是:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方,称为桶。
    但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。 总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。
    hash_map,首先分配一大片内存,形成许多桶。是利用hash函数,对key进行映射到不同区域(桶)进行保存。其插入过程是:
    得到key
    通过hash函数得到hash值
    得到桶号(一般都为hash值对桶数求模)
    存放key和value在桶内。
    其取值过程是:
    得到key
    通过hash函数得到hash值
    得到桶号(一般都为hash值对桶数求模)
    比较桶的内部元素是否与key相等,若都不相等,则没有找到。
    取出相等的记录的value。
    hash_map中直接地址用hash函数生成,解决冲突,用比较函数解决。这里可以看出,如果每个桶内部只有一个元素,那么查找的时候只有一次比较。当许多桶内没有值时,许多查询就会更快了(指查不到的时候).
    由此可见,要实现哈希表, 和用户相关的是:hash函数和比较函数。这两个参数刚好是我们在使用hash_map时需要指定的参数。
    PS:额外补充一下字典的组织方式:线性表,可以用基于数组的存储方式;也可以用基于链表的存储方式;跳表;散列表(hash table)。

  • 静态变量、全局变量、局部变量的存储方式?

1.栈 -用来保存定义在函数中的非static变量,由操作系统自动分配释放

2.堆 -存储动态分配的对象,一般由程序员分配释放,用malloc和new申请;其先后分配的内存地址不存在先后关系,但堆容易产生内存碎片

3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束释放。

4.另外还有一个专门放常量的地方。-程序结束释放

5程序代码区,存放2进制代码。

在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。[

头条ios客户端开发提前批

(大多都是C++语法知识点,很杂很碎)
1、指针和引用的区别?
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
(2)引用不可以为空,当被创建时,必须初始化,而指针可以是空值,可以在任何时候被初始化。
(3)指针可以有const,但引用没有const。
(4)指针可以有多级,但引用只有一级。
(5)指针的值在初始化后可以改变,即指向其他的存储单元,而引用在进行初始化后就不会再改变了。
(6)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏。
2、static关键字声明全局变量和局部变量有什么区别?
https://blog.csdn.net/cheatscat/article/details/79574409
全局变量前加static变成了静态全局变量,而全局变量本身就是静态存储方式,所以加了static后,在存储方式上并无不同。但是区别在于非静态全局变量的作用域是整个源程序,如果一个程序有多个源文件,非静态全局变量对于所有源文件有效。而静态全局变量只在定义该变量的源文件中有效,作用域局限于一个源文件内,因此可以避免在其他源文件中出现错误。
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
  static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
  static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

  extern全局变量、static全局变量和static局部变量的生存期都是“永久”,区别只是可见域不同。extern全局变量可见区域是工程,static全局变量可见区域是文件,而static局部变量的可见区域是块。

3、HTTP打开网页的过程?
(1) DNS解析,解析过程具体见https://blog.csdn.net/m0_37812513/article/details/78775629,
大致总结下,先检查浏览器自身缓存是否有该域名对应的IP地址,然后检查操作系统缓存,本地域名服务器(LDNS),如果还没有,就跳到根域名服务器,根域名服务器返回给LDNS一个查询的主服务器gTLD,LDNS发送请求给gTLD,gTLD查找并返回该域名的Name Server域名服务器地址,Name Server根据映射关系表查找目标IP,返回给LDNS,LDNS缓存域名和对应的IP,然后把解析结果返回给用户,用户根据TTL值缓存到本地系统缓存中。
DNS域名解析图解
(2)TCP连接
浏览器通过DNS获取到服务器的IP地址后,便向web服务器发出连接请求,经过3次握手建立好连接后,浏览器便可以将HTTP请求数据发送给服务器了。
(3)发送HTTP请求
(4)服务器处理并返回HTTP报文
(5)浏览器解析渲染页面
######附加一个问题: DNS用什么协议传输?
######DNS占用53号端口,同时使用TCP和UDP协议,DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。

区域传输:辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。
域名解析时使用UDP协议:

域名解析使用UDP协议:客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

4、简述4次挥手,为什么要4次挥手?
https://blog.csdn.net/qq_38950316/article/details/81087809
现总结如下:
四次挥手

  1. 为什么握手是3次,挥手是四次?

因为握手时可以直接发送SYN和ACK报文,而挥手时需要双方都把数据发送完毕,当一端收到另一端的FIN=1报文时,并不会立即关闭连接,只能先回复一个确认号,等到我这端的数据都发完了,再发送FIN=1,因此确认号和FIN不能一起发送,需要四次。

  1. 为什么TIME_WAIT状态要经过2MSL(最大报文段生存时间)才能关闭?

因为最后一个ACK可能丢失,所以TIME_WAIT就是用来重发可能丢失的ACK报文。client最后发出ACK回复,但该ACK可能丢失,server如果没有收到ACK,将不断重复发FIN片段,所以client不能立即关闭,它必须确认server收到了该ACK信号。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间,client会等待2MSL时间,如果在该时间内,client再次收到了server发送的FIN,则client会重发ACK并再次等待2MSL;如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

  1. 为什么不能2次握手?
    在这里插入图片描述

2次握手指的是客户端先发送建立连接的请求,然后服务器发送一个应答信号就默认连接了。但是如果这个应答信号在传输中被丢失了,客户端不知道服务器是否已准备好,也不知道服务器建立什么样的序列号,甚至怀疑服务器是否收到了自己建立连接的请求,在这种情况下,客户端认为连接还未建立,将忽略服务器发送的任何数据分组,只等待连接确认应答分组,而服务器在发送的分组超时后,将重复发送同样的分组,这样就形成了死锁。

  1. 如果已经建立了连接,客户端突然出现了故障怎么办?

TCP设有一个保活计数器,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

5、用New申请一块内存,申请不成功,怎么办?
使用try…catch捕获异常来处理内存失败,比如
try
{
int p_i=new int[10241024*1024];
}
catch(bad_alloc &memExp)
{
// 失败以后,要么 abort 要么重分配
cerr<<memExp.what()<<endl;
}
解决方法:在程序中加入delete及时释放内存,并对原始数据进行分割处理。

对于malloc方式申请的内存,通过是否是零指针区别是否申请成功。

6、如何判断2个浮点数相等?
https://blog.csdn.net/xiao_mrs_li/article/details/78666383
用相对误差、绝对误差判断

      bool IsEqual(float a, float b, float absError, float relError )
      {
      			if (a==b) return true;
		       if (fabs(a-b)<absError ) return true;     //绝对误差
		
		        if (fabs(a>b) return  (fabs((a-b)/a>relError ) ? true : false;      //相对误差
		
		       return  (fabs((a-b)/b>relError ) ? true : false;
        }

7、如何判断结构体成员的偏移量?
结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏在stddef.h中定义,
例: struct S2
{
int i;
char c;
};
要获得S2中C的偏移量,可用size_t pos=offsetof(S2,c); //pos等于4

注意:对于复合类型的结构体,比如一个结构体里包含另一个结构体,应当把这个子结构体拆开来看。例如:
struct S3
{
char c1;
S1 s;
char c2
}; S3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型为int,sizeof(S3)=4+8+4=16。

猿辅导(软件开发)

1、自我介绍,主要介绍做过的项目
2、根据我项目提出的连接到基站服务器,人家问我怎么连接的,其实我只是本地连接,
3、http打开网页的流程?(上面就有)

  • DNS解析,得到对应的IP地址,本地名字服务器为了得到一个IP地址,往往需要查询多个名字服务器,在查询地址的同时,本地名字服务器也得到了许多其他名字服务器的信息,像它们的IP地址,所负责的区域等。本地名字服务器把这些信息连同最后查到的主机IP地址全部存放到它的cache中,供以后查询使用。当下次解析器再查询与这些域名相关的信息时,就可以直接引用。这样,就大大减少查询时间了。如果名字服务器cache保存有客户所请求的IP地址,则名字服务器直接给出应答。即使没有,它也知道负责该区域的名字服务器信息,可以查询这些名字服务器,而不必从根开始逐级查询。需要注意:cache中保存的资源记录会受到生存期(TTL)的限制,一旦超过生存期,该资源记录将被清掉。
  • TCP连接
  • 发出HTTP请求
  • 服务器处理并返回HTTP报文
  • 浏览器解析渲染页面

4、登录界面是怎么判断登陆成功?
5、在网页上登录时,如果一次登录该网站,当第二次打开这个网站时,直接就是登录状态,此时浏览器保存了什么?

一、cookie
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器(服务器通过向HTTP响应头添加特殊指示来提示浏览器生成相应的cookie)。然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,(浏览器检查所有存储的cookie。如果cookie声明范围大于或等于要请求的资源的位置,则cookie将附加到请求资源的HTTP请求标头并发送到服务器),服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据

session使用Hash散列表结构来保存信息。
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。

问:cookie和session的区别?

  1. cookie数据存放在客户的浏览器上,session放在服务器上。
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全,应避免将敏感的信息写到cookie上,使用session。
  3. session会在一定时间内保存到服务器上,当访问增多,会比较占用服务器的性能。
  4. 单个cookie保存的数据不超过4k,很多浏览器设置站点最多保存20个cookie。

6.虚继承是为了解决什么问题?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值