字节面试复盘

个人介绍

这一部分个人提前准备,展现技术栈和特点就好。

问题1:项目问题——@MultipartForm 原理解析

@MultipartForm :用于解析多部分表单数据上传(基于JAX-RS框架)

框架会在接收到请求时检查 Content-Type 头是否为 multipart/form-data。如果是,它会解析请求体中的每个部分,并根据表单数据类(如 FileUploadForm)中的字段注入相应的数据。

问题2:断点续传的实现

断点续传是指在文件传输过程中发生中断后,能够恢复传输,并从上次中断的位置继续传输。

1、记录已经传输的文件位置:在每次传输过程中,记录已经成功传输的文件位置或字节数,以方便下次传输时从该位置开始。

2、传输过程的中断和恢复:在传输过程中,如果发生了中断,需要能够恢复传输,并从上次记录的位置继续传输。

技术选型:

1、RandomAccessFile:Java中的一个类,可以实现对文件的随机访问,适用于断点续传功能的实现。

2、HttpURLConnection:Java中用于处理HTTP请求的类,可以通过设置请求头部信息实现下载文件的断点续传。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class ResumeDownload {
private static final String FILE_URL = "http://example.com/file.txt";
private static final String SAVE_PATH = "/path/to/save/file.txt";
private static final String TEMP_PATH = "/path/to/save/file.txt.tmp";

public static void main(String[] args) {
try {
URL url = new URL(FILE_URL);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);

long startPosition = 0;
if (connection.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) {
// 通过range字段获取文件断点位置
startPosition = connection.getHeaderFieldLong("Range", 0);
}

RandomAccessFile file = new RandomAccessFile(SAVE_PATH, "rw");
// seek方法可以将文件指针移动到指定位置。
file.seek(startPosition);

InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
file.write(buffer, 0, length);
}

file.close();
connection.disconnect();

System.out.println("Download completed.");
} catch (IOException e) {
e.printStackTrace();
}
}
}

问题3:JWT的字段3部分

Header(头部)

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

Payload(负载)
用来存放实际需要传递的数据
Signature(签名)

1
2
3
4
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

问题4:JWT和Session的区别

session

  1. 用户输入其登录信息

  2. 服务器验证信息是否正确,并创建一个session,然后将其存储在数据库中

  3. 服务器为用户生成一个sessionId,将具有sesssionId的Cookie将放置在用户浏览器中

  4. 在后续请求中,会根据数据库验证sessionID,如果有效,则接受请求

  5. 一旦用户注销应用程序,会话将在客户端和服务器端都被销毁

JWT:

  1. 用户输入其登录信息

  2. 服务器验证信息是否正确,并返回已签名的token

  3. token储在客户端,例如存在local storage或cookie中

  4. 之后的HTTP请求都将token添加到请求头里

  5. 服务器解码JWT,并且如果令牌有效,则接受请求

  6. 一旦用户注销,令牌将在客户端被销毁,不需要与服务器进行交互一个关键是,令牌是无状态的。后端服务器不需要保存令牌或当前session的记录。

数学题

如果在高速公路上30分钟内到一辆车开过的几率是0.95,那么在10分钟内看到一辆车开过的几率是多少()?

解答:

设10分钟内没有看到一辆车的概率为1-x,30分钟内没有看到一辆车看作连续事件
$$ ( 1 − x ) × ( 1 − x ) × ( 1 − x ) = 1 − 0.95 $$

解:

$$ x=1− \sqrt[3]{1-x}=1−0.368403=0.631596 $$

算法题:栈的出栈、入栈 序列

https://leetcode.cn/problems/validate-stack-sequences/description/

思路: 模拟栈


class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
       Deque<Integer> stack = new ArrayDeque<>();
       int n = pushed.length;
       int j = 0;
       for(int i=0 ;i < n ;i++){
        stack.push(pushed[i]);
        while(!stack.isEmpty() && stack.peek() == popped[j]){
            stack.pop();
            j++;
        }

       }
       return stack.isEmpty();
    }
}```