字节面经,流程中(问题附答案)
国际支付一面
HTTP协议连接过程?
- 就是TCP三次握手的过程,首先发送方发送连接请求报文段,同步标志位SYN=1,初始序号seq=x,不能携带数据;
- 服务端发回确认,SYN=1,ACK=1,seq=y,ack=x+1;
- 客户端给出确认,不设置同步标志位,ACK=1,seq=x+1,ack=y+1,该报文段可以携带数据,若不携带数据则不需要消耗序列号;
HTTP有状态还是无状态?
- 无状态;
HTTP怎么保存状态?
- Cookie:存放在客户端的一小段数据,会在浏览器向服务器发送请求时被携带发送在服务器上。通常它用于告知服务端两个请求是否来自同一浏览器,通常有以下三方面用途:
- 回话状态管理:用户登录状态、购物车、游戏分数或者其他需要记录的信息。
- 个性化信息:用户自定义设置、主题等等。
- 浏览器行为跟踪:跟踪分析用户行为等。
- Session:代表着服务器和客户端一次回话的过程,session对象存储特定用户会话所需要的属性及配置信息。这样,当用户在用户在应用程序的web页之间跳转时,存储在session对象中的变量不会消失。当浏览器关闭会话或者session超时失效时会话结束。
- Token:当浏览器禁用cookie时,可以采用Token机制。Token是服务端生成的一个字符串作为客户端请求的标识,第一次用户登录后服务器产生一个Token交给客户端,以后的每次请求都携带这个Token就好而无需再次登录验证。
- Cookie:存放在客户端的一小段数据,会在浏览器向服务器发送请求时被携带发送在服务器上。通常它用于告知服务端两个请求是否来自同一浏览器,通常有以下三方面用途:
HTTP和HTTPS的区别?
- 区别在于超文本传输协议是明文传输的,而HTTPS则是加密传输的;
- HTTPS的加密过程如下:
- 服务端向CA机构申请数字证书,然后发送给客户端;
- 客户端在证书中获取非对称加密的公钥K,并根据证书中的信息确认该证书来源于自己想要申请的网站;
- 客户端生成一个用于对称加密的秘钥X,并用公钥K加密X传输给服务端;
- 服务端用私钥K`解密得到X;
- 服务端和客户端用X加密信息进行传输;
Session怎么实现?
- 这个我没答上来,因为没有相关经验;
Java HashMap原理?
- 底层用hash表实现,冲突处理采用拉链法;
- JDK8之后,当拉链个数增加到8之后会转化为红黑树,减少到6会从红黑树转化回链表,之所以不设置为7是为了防止冲突多次介于7、8之间时造成频繁的链表和树的转化;
- 至于达到8之后,由于对于当个桶而言,源源不断的冲突元素流的个数是服从泊松分布的,而且只有放入和不放入两种可能,因此期望为1/2,因此该泊松分布的参数就是1/2,可以得到单个桶冲突个数达到8的概率为百万分之六,已经很小了,因此可以选择8作为阈值;
- 面试官只是问原理让我自己说,我说了这些,面试官就没让我继续说别的;
写了一个Student类,问加到HashMap之后修改了这个Student的id,能不能get到?
- 我当时回答的是这要看Student重写的equals和hashcode两个方法用的是Student的哪个属性,如果用的id属性那肯定获取不到,如果不是那就能get到;
synchronized原理?
- Java并发过程中用于保证共享变量互斥访问安全性的关键字,方法是竞争到锁之后将并行转化为串行,执行完临界区代码之后释放锁再由其他线程争取;
- 面试官追问:那接下来的线程获取锁是按顺序的吗?
- 回答:不是,synchronized的底层虽然维护了阻塞队列,但是monitor释放资源后,是由操作系统进行竞争的,因此能否竞争到不取决于线程。当然,由于是操作系统进行竞争,这就涉及到内核态和用户态的转化,会在一定程度上降低效率,不过后来Java对synchronized进行了优化,引入了轻量级锁、偏向锁的概念;
- 回答道这面试官没接着问了;
算法:LC3,最长无重复子串:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
class Solution { public int lengthOfLongestSubstring(String s) { int n=s.length(), j=1, maxLength=0; HashSet<Character> set=new HashSet<>(); char[] array=s.toCharArray(); for(int i=0;i<n;i++){ if(i==0) set.add(array[i]); while(j<n&&!set.contains(array[j])){ set.add(array[j]); j++; } maxLength=Math.max(maxLength, j-i); set.remove(array[i]); } return maxLength; } }
二面(三道题)
算法:不使用相关API实现对2开方,要求精度可变;
- 二分查找,左右端点小于一个精度就突出循环,代码不写了;
数据库:学生信息、教师信息、课程信息,一个学生可以选多门课,一门课可以多个学生选,一个老师教多门课,一门课一个老师教,问需要几个表,写出来;
- 四个,学生一个,教师一个,课程一个,选课一个;
智力题:三妃分金——100个金子三个妃子分,三个人依次提出分金方案,获得大于一半的人支持就这么分,否则处死提方案的人,剩下的人继续;对每个人而言:每个人在生存的前提下拿尽可能多的钱;
- 答:如果第一个人死了,第二个人一定会死,因此为了活着第二个人必须支持第一个人,因此分配方案为100,0,0;
- 面试官追问:四妃分金呢:
- 答:如果第一个人死了情况转化为上一题,为了拿到更多钱第三、四个人一定会支持第一个人,因此分法就是98,0,1,1;
- 反问面试官:这个问题具有某种类似子结构的性质,那么如果输入规模增加怎么编程解决这个问题呢?
- 面试官说没想过这个问题,不过可以一起分析一下,于是就一起做了五妃分金,找规律,做完时间就到了,结束了就;
三面
这一面完事之后是电话跟同学说的,所以没记录,有点忘了;
算法:链表乘法:保持链表的结构进行乘法,题挺墨迹,最后写完了没过,应该哪个数写错了,没时间debug就这样了;
这一面没过,我觉得可能是coding没跑过的原因;
目前在面另一部门,感谢其他大佬鼠们分享的面经,所以我就把自己的也整理了一下发出来,希望对大家有帮助,另外也希望这个部门的面试能过,面完再发面经;
#字节面试##面经#