462-百度面经2

0、前言

哈希表 红黑树!

1、两个栈实现一个队列,栈的特性、队列的特性

栈的应用

  • 递归代码转成非递归代码,使用栈!

队列的引用

  • 哈夫曼编码,用到非递归,就用到队列!

线性表 排序算法 哈希表 二叉树 五大算法

2、BST树的第K大的节点,BST树的结构和特性?

BST树

  • 左节点的值 < 当前节点 < 右节点的值;
  • 是一颗二叉树,不一定平衡!
  • 中序遍历是一个从小到大排序的!

BST AVL RB B-树 B+树:

  • 都是一颗BST树;(可以进行相互延伸!)

BST树的第K大的节点:求中序遍历第K大的节点即可!

3、vector底层数据结构,为什么是2倍扩容?

size:得到元素的个数;
compacity:容量大小;

可以构造一个函数,不断的向vector中插入元素,打印size大小和compacity大小,即可知道是怎么扩容的!(Win是1.5倍扩容,GCC下是2倍扩容!)

为什么是2倍扩容?

  • 涉及到扩容的均摊时间
  • 以倍数扩容时,效率是最高的!

为什么1.5倍扩容最好?

2倍扩容:

  • 0 1 2 4 8 16 32 64 2倍扩容; 用户调用malloc,在glibc下是通过ptmalloc实现基于bin和chunk的内存管理, malloc按照页面 - 内核分配brk(分配小块内存) mmap(分配大块内存)
  • 2倍扩容新的内存,原来的内存是永远不能重复利用的!

1.5倍扩容:

  • 0 1 2 3 4 6 9 1.5倍扩容
  • 利于内存的复用 内存碎片的复用;可以将前面释放的内存复用起来!
  • 1.5倍扩容新的内存,原来的内存是永远可以重复利用的!

4、map、set

关联容器

  • set和map:红黑树;

  • unordered_set和unordered_map:哈希表

使用场景:

  • 只要应用的场景对数据的增删查都有要求,对于数据的有序性没有要求,一般都使用哈希表;反之使用红黑树。

为什么底层使用红黑树或哈希表?

  • 介绍红黑树的特点,旋转、增加、左旋、右旋,颜色时如何变化的;
  • 对于哈希表,哈希冲突,链式哈希表,常用的哈希函数;

位图、哈希表、布隆过滤器!解决问题经常一起思考的!

5、gcc是什么工具,编译链接原理

编译链接原理:程序员的自我修养!

gcc:编译工具,编译工具链,最早编译C语言,后面各种语言都可以编译!

g++:编译C++

gdb coredump gcc *.cpp*

coredump:核心的堆转储文件,记录程序挂掉的内存的详细信息,以及各个线程函数调用堆栈的信息!

使用gdb调试,查看程序为什么挂掉了!使用gdb直接调试coredump!

在C++中写的C++代码,用了C++的io流、STL,还有gcc编译时会产生链接错误!默认的链接的是libc.so,而不是libc++.so

6、linux下的进程状态,如何查看进程的状态?

面试考察:

  • Linux的进程和线程;
  • 怎么解释进程和线程,后面讲解;
  • 进程的状态,进程的通信;
  • 线程状态,线程的通信;

进程的状态:

  • R:表示2个,就绪和运行,不管是正在享受CPU的时间片,正在被调度,还是调度中,收拾R状态;
  • S:sleeping,睡眠状态,是可中断的;
  • D:不可中断状态,只有通过IO事件唤醒才可以;
  • T:调试程序时,线程stop状态;
  • Z:僵尸状态,进程结束了,内核资源PCB还没有被回收,没有被wait;僵尸态的资源不能多,太多的话会占用我们内核资源,导致系统能创建进程的数量变少,线程在内核中也是占用PCB,同样也会影响线程的数量;

如何查看进程的状态?

方法1:

ps aux | less

在这里插入图片描述


方法2:

cd /proc/	#进入proc文件系统

proc文件系统中有以pid号命名的文件夹,
在这里插入图片描述

进入22969进程的目录:
在这里插入图片描述
可以查看下进程的状态:

在这里插入图片描述


查看某一个服务

比如查看tcp服务:

netstat -tanp

在这里插入图片描述
拿到1502这个进程号后,

ps aux | grep 1502

在这里插入图片描述


进程怎么通信?

线程怎么通信?

  • 线程是共享地址空间的,可以通过共享的数据段和堆来进行共享!
  • 互斥。可以用互斥锁、读写锁、自旋锁、CAS(简单的++,–)
  • 线程间通信:条件变量、信号量

7、HTTP数据包组成,如何解析HTTP数据包?

http 和 https(http + ssl 加密认证过程,签名,CA认证,对称加密和非对称加密)

HTTP数据包组成?

  • 从实践 的角度看,真正的动手做过!
  • 怎么查好看的?wirshark抓包,使用浏览器符F12…

8、传输层采用TCP协议,在应用层读取数据时,如何判断是否读完,如果没读完,如何计算还剩下多少?

考察TCP的粘包问题;

TCP是一个流式协议;

TCP的粘包问题怎么解决?

  • 给数据加一个数据头;(项目中有体现)

传输大文件,如何判断还剩多少?

  • 支持秒传;每一次传输文件,前期都会用文件内容计算md5值,将filesize+md5值发送到服务端,服务端记录了所有已经保存文件的md5值;
  • 匹配到了,说明文件已经在服务端存在了,客户端显示直接传输成了;
  • 如果是一个新文件,表示服务端返回OK已准备好,可以传输;服务端记录了文件的大小
    ;服务端接收的时候,就可以根据最开始协商的filesize不断的检测现在已经读了多少,剩下多少,可以显示进度信息!
  • 从以上这些角度说就行了!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《java面经-百度准入职老哥整理.pdf》是一份关于百度准入职面试的Java面经整理。这份面经是由百度准入职的老哥整理而成,其中记录了一些面试时可能会遇到的问题以及解答方法。 这份面经对于准备参加百度准入职面试的人来说非常有价值。首先,它列出了一些常见的面试问题,涵盖了Java语言的各个方面,包括基础知识、数据结构与算法、设计模式、多线程、网络编程等等。通过仔细研究和复习这些问题的答案,可以帮助面试者全面了解Java语言的特性和应用。 其次,这份面经还提供了问题的解答思路和方法,帮助面试者理清思路,正确回答问题。这对于很多面试者来说特别有帮助,因为在面试时有时会遇到一些棘手的问题,有了这份面经的指导,面试者可以更好地掌握应对策略。 不过需要注意的是,面经作为一份参考资料,不能完全依赖于它来准备面试。面试官可能会问一些不在面经中列出的问题,因此考生还是需要自己对Java语言有充分的了解,并能够熟练运用。同时,面试官还会关注考生的沟通能力、解决问题的能力以及对新技术的学习和掌握能力。 总体来说,《java面经-百度准入职老哥整理.pdf》是一份非常宝贵的资料,可以帮助面试者对Java面试中可能会遇到的问题有更深入的了解,提供了解答思路和方法。但记住,面试准备还需要多方面的知识积累和实践经验的积累,才能在面试中展现自己的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufeng2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值