百度暑期实习 C++ 一面

1.数组 链表

数组是一种线性数据结构,其中相同类型的元素连续存储在一段内存中,并且可以通过索引来访问每个元素。数组的优点是随机访问元素非常快速,但缺点是插入或删除元素可能需要移动其他元素。

链表也是一种线性数据结构,但不同于数组,它使用节点来存储数据,并将这些节点连接在一起。每个节点包含一个数据元素和指向下一个节点的指针。链表的优点是可以快速插入和删除节点,但缺点是访问任意节点需要遍历整个链表,因此访问时间比数组慢。

在选择数组和链表之间时,需要根据实际需求考虑它们各自的优点和缺点。如果需要快速访问元素并且元素的数量不会经常变化,则数组可能更适合。如果需要频繁插入和删除元素,则链表可能更合适。

2.归并排序 是否是稳定的?

归并排序是一种稳定的排序算法,它的稳定性来源于它的合并操作。

在归并排序中,将数组分成两个部分进行递归排序,并将这两个部分合并到一起。在合并的过程中,如果两个元素的值相等,我们会优先将左边部分的元素放入结果数组中,这就保证了相同元素的前后顺序不会被改变。因此,归并排序是一种稳定的排序算法。

3. C++内存分配

C++中有两种内存分配方式:静态内存分配和动态内存分配。

静态内存分配
静态内存分配是指在编译时就确定了内存的大小和位置,由编译器负责分配和释放。通常用于定义全局变量、局部静态变量和数组等。

动态内存分配
动态内存分配是在程序运行时根据需要动态地分配和释放内存。C++提供了两个操作符来实现动态内存分配:new和delete。

  • new操作符用于在堆上分配一段指定大小的内存,并返回该内存的地址。
  • delete操作符用于释放通过new操作符分配的内存。

4. 面相对象特点

  • 抽象(Abstraction):把对象的共性特征提取出来,形成类(Class),并定义出类的属性和方法。抽象能够处理复杂的问题,使得系统更易于理解和修改。
  • 封装(Encapsulation):将类的属性和方法组合在一起,并限制对象对这些属性和方法的访问权限。封装保证了数据的安全性和完整性,同时也隐藏了细节,降低了系统的耦合度。
  • 继承(Inheritance):通过继承机制,子类可以继承父类的属性和方法,从而避免了代码的重复和冗余。继承提高了代码的可重用性和可扩展性。
  • 多态(Polymorphism):多态指同一个操作作用于不同的对象上面,可以产生不同的结果。例如,一个基类有两个派生类,它们都具有相同的函数名,在程序中使用时,系统根据上下文自动选择正确的函数调用。多态提高了程序的灵活性和可维护性。

5. 进程间通信方式

常见的进程间通信方式包括:

  • 管道(Pipe):管道是一种半双工的通信方式,它可以在具有亲缘关系的两个进程之间传递数据。管道主要通过系统调用pipe()或popen()来创建。

  • 命名管道(Named Pipe):命名管道也是一种半双工的通信方式,但是它可以在没有亲缘关系的两个进程之间进行通信。命名管道可以在文件系统中创建,并且可以被多个进程同时访问。

  • 信号(Signal):信号是一种异步的通信方式,它可以在不同的进程之间传递信息。当一个进程向另外一个进程发送信号时,操作系统会中断接收进程正在执行的任务,并调用该进程注册的信号处理函数来处理信号。

  • 共享内存(Shared Memory):共享内存是一种高效的进程间通信方式,它允许多个进程之间共享同一块物理内存区域。共享内存通过系统调用shmget()、shmat()和shmdt()来实现。

  • 消息队列(Message Queue):消息队列是一种带有消息缓冲区的通信方式,它可以在不同的进程之间传递数据。消息队列可以通过系统调用msgget()、msgsnd()和msgrcv()来实现。

  • 套接字(Socket):套接字是一种全双工通信方式,它可以在不同的主机或进程之间进行通信。套接字通常用于网络编程和分布式系统中。

6. 死锁四条件,解除死锁方法

形成死锁必须同时满足以下四个条件:

  • 互斥条件:每个资源都只能被一个进程使用,如果有其他进程请求该资源,则必须等待。

  • 请求与保持条件:进程在请求资源时,保持已经占有的资源不放。

  • 不剥夺条件:进程已经得到的资源,在未使用完之前不能被其它进程强行取走。

  • 循环等待条件:进程之间形成一种头尾相接的循环等待资源的关系。

解除死锁的方法主要包括以下几种:

  • 预防死锁:通过破坏死锁的四个必要条件来预防死锁的发生。例如,避免互斥、请求和保持、不剥夺和循环等待等。

  • 避免死锁:在运行时动态地分配资源,并根据资源的当前使用情况来避免死锁的发生。

  • 检测死锁:通过检测系统中的资源分配情况来判断是否有死锁的发生。如果检测到了死锁,则可以采取相应的措施来解除死锁。

  • 解除死锁:当检测到死锁时,可以通过剥夺某些进程占用的资源来解除死锁。一般情况下,系统会选择牺牲优先级较低的进程来解除死锁。

7. 什么是并发,并行,异步

  • 并发(Concurrency):指在同一时间段内执行多个任务,但不一定同时执行。在并发的情况下,系统通过交替执行各个任务来实现看似同时执行的效果。

  • 并行(Parallelism):指在同一时刻执行多个任务,通常需要多个处理器或者多个核心才能实现。在并行的情况下,系统可以同时执行多个任务,提高了系统的处理能力和性能。

  • 异步(Asynchrony):指一个操作不会立即得到结果,而是在将来某个时候才会得到结果。异步操作可以让程序在等待结果的同时继续执行其他任务,从而提高系统资源的利用率。

8. OSI七层模型 传输层 应用层

OSI七层模型是一种标准化的网络通信架构,它将计算机网络协议分为七个不同的层次。这些层次从下到上依次是:

物理层(Physical Layer)
数据链路层(Data Link Layer)
网络层(Network Layer)
传输层(Transport Layer)
会话层(Session Layer)
表示层(Presentation Layer)
应用层(Application Layer)

传输层(Transport Layer)是OSI模型中的第四层,其主要功能是在网络的两个节点之间提供可靠的数据传输服务,并确保数据按照正确的顺序和速度传输。

传输层的协议有两种:TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。TCP是面向连接的协议,可靠性较高,但是传输效率较低。UDP是面向无连接的协议,传输效率更高,但是可靠性较差。

应用层(Application Layer)是OSI模型中的最高层,其主要功能是为用户提供各种网络应用程序,例如Web浏览器、电子邮件、文件传输等。应用层使用各种协议来定义数据的格式和传输方式,例如HTTP、SMTP、FTP等。

9. http网络状态码 400以上的 500 502 什么时候出现?

以下是常见的400以上的HTTP状态码及其含义:

  • 400 Bad Request:客户端请求有语法错误,服务器无法理解;
  • 401 Unauthorized:客户端未经授权,请求需要身份验证;
  • 403 Forbidden:客户端没有访问权限;
  • 404 Not Found:请求的资源不存在;
  • 405 Method Not Allowed:请求方法不允许使用;
  • 408 Request Timeout:请求超时;
  • 429 Too Many Requests:请求过多,服务器拒绝服务。

以下是常见的500系列的HTTP状态码及其含义:

  • 500 Internal Server Error:服务器内部错误;
  • 501 Not Implemented:服务器不支持请求的功能;
  • 502 Bad Gateway:网关代理服务器收到了无效响应;
  • 503 Service Unavailable:服务器暂时无法提供服务;
  • 504 Gateway Timeout:网关代理服务器请求超时;
  • 505 HTTP Version Not Supported:服务器不支持请求的HTTP版本。

400以上的状态码通常是客户端出现了错误或异常情况,例如请求参数错误、访问权限受限等。而500系列的状态码通常是服务器内部出现了错误或异常情况,例如数据库连接失败、程序bug等。

10. 三次握手

三次握手(Three-Way Handshake)是TCP协议建立可靠连接的过程,其流程如下:

客户端向服务器发送SYN报文,请求建立连接。该报文包含一个随机生成的序列号。

服务器收到SYN报文后,如果同意建立连接,则向客户端发送SYN-ACK报文。该报文中包含确认号(即客户端的序列号加1),以及另一个随机生成的序列号。

客户端收到服务器的SYN-ACK报文后,还需要向服务器发送ACK报文进行确认。该报文中包含确认号(即服务器的序列号加1)。一旦服务器收到了客户端的ACK报文,连接就建立完成了。

这个过程是三次握手的原因:在建立连接时,需要客户端和服务器相互确认对方的身份及数据传输能力。其中,第一次握手是客户端向服务器发送SYN报文,第二次握手是服务器收到SYN报文后向客户端发送SYN-ACK报文,第三次握手是客户端收到SYN-ACK报文后向服务器发送ACK报文进行确认。通过这三次握手,客户端和服务器可以确保彼此之间的通信有效和可靠。

11. linux命令知道哪些?sed awk会不会

linux命令:

  • 文件和目录操作:ls, cd, mkdir, rm, cp, mv, tar等。

  • 用户和权限管理:useradd, userdel, passwd, chmod, chown等。

  • 网络和系统配置:ifconfig, ping, route, netstat, ps, top, service等。

  • 文本处理和搜索:cat, head, tail, grep, awk, sed等。

  • 软件包管理:yum, apt-get等。

  • 编辑器:vi, vim等。

至于sed和awk,它们都是文本处理工具,在Linux系统中使用较为广泛。其中,sed是一种流编辑器,可以在文件中进行查找、替换和删除等操作。而awk则是一种强大的文本处理工具,具有高级的文本分析和处理能力。

12. 文件内按照某一列值排序 sort?

是的,sort命令可以按照文件中某一列的值进行排序。sort命令默认以空格作为分隔符,可以通过选项-t指定其他分隔符。

假设我们有一个名为file.txt的文件,它包含如下内容:

John 25
Alice 30
Bob 22
Tom 28

如果我们想按照第二列的数值进行排序,可以使用如下命令:

sort -k2n file.txt

其中,-k2表示按照第二列进行排序,-n表示按照数值排序(默认为字典序),输出结果如下:

Bob 22
John 25
Tom 28
Alice 30

如果我们想按照第二列的数值进行逆序排序,则可以使用如下命令:

sort -k2nr file.txt

其中,-r表示逆序排序,输出结果如下:

Alice 30
Tom 28
John 25
Bob 22

你可能感兴趣的:(面试,c++,数据结构,算法)