后端面试必备:TCP握手、数据流与UDP、const原理等解析

需积分: 41 21 下载量 27 浏览量 更新于2024-09-09 1 收藏 16KB DOCX 举报
"这篇内容是关于后端面试的题目总结,涵盖了网络协议、编程语言特性、数据结构与算法等多个方面。" 1) TCP三次握手是一个建立可靠连接的过程。在这个过程中,客户端首先发送SYN包,服务器响应SYN+ACK,然后客户端再次发送ACK来确认连接。accept函数是在三次握手完成后调用,用于接受已完成连接的请求。 2) TCP和UDP的主要区别在于,TCP提供的是面向连接、有序且可靠的字节流服务,而UDP则是无连接、无序且不可靠的数据报服务。TCP的数据无明确边界,可以想象成一个连续的流;而UDP每个数据包都是独立的,有明确的起点和终点。 3) 在C/C++中,const关键字用于声明常量,表示变量的值不应被修改。编译器会检查对const变量的写操作,试图修改时会报错。在某些情况下,编译器可能会对const变量进行优化,将其替换为常量。 4) volatile关键字用于指示变量的值可能在编译器无法察觉的情况下发生变化,例如硬件中断或多线程环境。它告诉编译器不要对这类变量做优化,每次访问都需要从内存中读取。 5) OFFSETOF宏通常用于获取结构体中某个成员相对于结构体起始位置的偏移量。示例中的定义利用了C语言的类型转换和指针运算来计算偏移量。 6) 求解100亿个数中最大的1万个数,可以使用大顶堆数据结构。初始时将前1万个数构建为堆,之后每新加入一个数,如果比堆顶元素大,则替换堆顶并下沉调整,确保堆始终保持最大1万个数。时间复杂度为O(n log k),n为总元素数量,k为需要找到的最大元素数量。 7) 洗牌算法通常采用Fisher-Yates(或称为Knuth)洗牌算法,随机性较高且效率良好。该算法通过遍历数组,每次选择一个随机位置与其当前位置的元素交换。在实现中,大约需要进行n/2次交换,其中n为数组长度。由于涉及随机操作,时间复杂度为O(n)。 这些面试问题涵盖了网络协议基础、并发控制、数据结构和算法等核心后端开发知识点,对于准备后端面试的人来说是很好的参考资料。