百度测开一面

面试问题来源于牛客网,然后自己去网上搜了一些资料应对这些问题
https://www.nowcoder.com/discuss/361957?type=post&order=hot&pos=&page=1&subType=2

两个栈实现一个队列代码
在这里插入图片描述
补充:两个队列实现一个栈

在这里插入图片描述

三次握手
为什么是三次?可以去掉一次吗?

  1. Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

SYN:同步序号。
ACK :确认序号。
seq: (sequence number) 序列号
ack:(acknowledge number) 确认号。

为什么不能改成两次
这主要是为了防止已失效的请求连接报文忽然又传送到了,从而产生错误。
假定A向B发送一个连接请求,由于一些原因,导致A发出的连接请求在一个网络节点逗留了比较多的时间。此时A会将此连接请求作为无效处理 又重新向B发起了一次新的连接请求,B正常收到此连接请求后建立了连接,数据传输完成后释放了连接。如果此时A发出的第一次请求又到达了B,B会以为A又发起了一次连接请求,如果是两次握手:此时连接就建立了,B会一直等待A发送数据,从而白白浪费B的资源。 如果是三次握手:由于A没有发起连接请求,也就不会理会B的连接响应,B没有收到A的确认连接,就会关闭掉本次连接。

Tcp长连接和短连接区别,怎样保持长连接
长连接:
在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信);
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;

短连接:
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);
连接→数据传输→关闭连接;

应用场景:
长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好;
在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

数据库查询
MySQL 数据库使用SQL SELECT语句来查询数据。

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

• 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
• SELECT 命令可以读取一条或者多条记录。
• 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
• 你可以使用 WHERE 语句来包含任何条件。
• 你可以使用 LIMIT 属性来设定返回的记录数。
• 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

以下实例将返回数据表 runoob_tbl 的所有记录:
读取数据表:
select * from runoob_tbl;

linux常用命令
开关机命令
1、shutdown –h now:立刻进行关机
2、shutdown –r now:现在重新启动计算机
3、reboot:现在重新启动计算机
4、su -:切换用户;passwd:修改用户密码
5、logout:用户注销
常用快捷命令
1、tab = 补全
2、ctrl + l -:清屏,类似clear命令
3、ctrl + r -:查找历史命令(history);ctrl+c = 终止
4、ctrl+k = 删除此处至末尾所有内容
5、ctrl+u = 删除此处至开始所有内容
man:帮助命令
wc:文本统计统计
du:文件大小统计
find:文件检索命令
展示目录列表命令ls(list)
2.切换目录命令cd(change directory)
3.目录的创建(mkdir)和删除(rmdir)命令
4.文件的创建(touch)和删除(rm)命令
5.文件打包或解压命令tar

修改文件/目录的权限的命令:chmod
cp (复制文件或目录)
rm (移除文件或目录)
mv (移动文件与目录,或修改名称)
cat由第一行开始显示文件内容
tac从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
kill :杀死某个进程
ps:查当前进程
nststat:查看端口开放情况

linux递归删除
#递归删除 特定文件夹
使用规则:
rm -rf 目录名字
-r 向下递归,不管有多少级目录,一并删除
-f 直接强行删除,没有任何提示

删除指定后缀的文件
find . -name “*.png” | xargs rm -rf
1.用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题
假如你有一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接

面向对象和面向过程的区别
面向过程
采用自顶向下、逐步求精的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺序、选择、循环三种基本控制结构构造。
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象:
面向对象,他的对象由两部分组成,一部分是描述状态或属性的数据(变量),另外一部分是描述对象行为或功能的方法(函数)
属性属于对象静态的一面,用来形容对象的一些特性,方法属于对象动态的一面 属性和方法称为这个对象的成员 具有同种属性的对象称为类,是个抽象的概念
面向对象就是高度实物抽象化、面向过程就是自顶向下的编程!
面向对象的特点:封装,继承,多态。
高内聚,低耦合的意思是,一个软件模块由相关性很强的一段代码组成,模块与模块之间的独立性却很强
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低

如何使用面向对象思想
面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,这是第三点。
面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面。
类是一类事物的一个抽象,具有共同特征的一类事物的一个抽象。对象是这个类具体的某一个实例,
类(对象)之间的关系
关联关系(最弱的一种关系)
继承关系(比较强的一种关系)
聚合关系(整体和部分)(比较强的一种关系)
实现关系
作为父类来说,我觉得我应该具有这样一个方法,但我不知道怎么去实现,谁去实现,我的子类去实现,这就是实现关系。和实现关系息息相关的还有一种关系叫多态。

猜你喜欢

转载自blog.csdn.net/alike_meng/article/details/104337182