一面(2h)

  1. 算法题(5道)

其他忘记了,基本上都是八股,问的比较细。

二面(1h40min)

  1. 如何设计一个hash表,已解决冲突特别多,数据量特别大的情况。

    在rehash时,采用渐进式rehash的方法,即从新开辟一个大内存区域,存放新的哈希桶,将旧桶中的值缓慢移至新桶。

    • get方法:先查询旧表,若查询失败,再查询新表(o(1)),肯定在!
    • set方法:直接修改新表。若还未移动旧表数据,则直接设置新表,待旧表中该数据移动时,查询到新表中包含该数据,则直接放弃。
  1. 两次握手会怎么样

    三次握手的功能:

    • 收发双方确切准备好
    • 协商初始序列号以及确定发送接受窗口大小

    二次握手情况下:(缺少客户端发送的第三次ACK,即服务端发送ACK,就认为连接已经建立) 防止已失效的连接请求报文段,又传送到了服务端,服务端建立连接浪费资源

  2. 三次挥手会怎么样

  3. 红黑树和B+树的区别

    红黑树和AVL的区别:
    插入均旋转两次,即O(1), 对于删除操作,最坏情况下,需要维护从被删除节点到根节点的所有节点平衡性,时间复杂度为O(logn)而红黑树只需要三次旋转(非严格平衡性,) AVL搜索稳定性(因为严格平衡)要高于红黑树。 应用场景:
    avl适合查询较多,删除较少的场景

  4. sizeof与strlen区别

    • sizeof为操作符,可以类型,函数作为参数;strlen为函数,只能以char * 作为参数,且必须包含’\0’
    • sizeof与strlen的操作结果均为size_t
      • sizeof:分配空间的实际字节数
      • strlen: 空间中字符的数量
    • sizeof编译器运行,strlen运行期执行
    • sizeof不能计算动态空间的大小
  1. char* s = "0123456789";
  2. sizeof(s); //结果 4 ===》s是指向字符串常量的字符指针
  3. sizeof(*s); //结果 1 ===》*s是第一个字符
  4. strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
  5. strlen(*s); //结果 10 ===》错误
  6. char s[] = "0123456789";
  7. sizeof(s); //结果 11 ===》s是数组,计算到\0位置,因此是10+1
  8. strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
  9. sizeof(*s); //结果 1 ===》*s是第一个字符

扩展:char s 与char s[]区别 【区别所在】 char s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变

【内存模型】
+——-+ +—-+—-+—-+—-+—-+—-+
s1: | *======> | h | e | l | l | o |\0 |
+——-+ +—-+—-+—-+—-+—-+—-+
+—-+—-+—-+—-+—-+—-+
s2: | h | e | l | l | o |\0 |
+—-+—-+—-+—-+—-+—-+

三面(1h50min)

  1. 算法题(5道)
    1. 链表相加
    2. K个链表翻转
    3. 数组右移
    4. 还有2道忘记了
  2. epoll底层原理
  3. 有点紧张,其他忘记了

    四面(50min)

  4. 项目,问的很细

  5. 场景题:
    1. 假设有一块很大的可用内存区域,如何去进行管理
    2. 如何实现一个全文扫描

其他忘记了。

HR面()

待写入