设计文件分享系统
难度:
标签:
题目描述
代码结果
运行时间: 192 ms, 内存: 23.5 MB
// Solution for Leetcode Problem 1500: Design a File Sharing System using Java Streams
// Similar to the standard Java solution, but leveraging Java Streams for operations.
import java.util.*;
import java.util.stream.Collectors;
class FileSharingStream {
private Map<Integer, Set<Integer>> fileToUsers;
private Map<Integer, Set<Integer>> userToFiles;
private int fileIdCounter;
public FileSharingStream() {
fileToUsers = new HashMap<>();
userToFiles = new HashMap<>();
fileIdCounter = 0;
}
public int uploadFile() {
int fileId = ++fileIdCounter;
fileToUsers.put(fileId, new HashSet<>());
return fileId;
}
public void downloadFile(int userId, int fileId) {
fileToUsers.computeIfAbsent(fileId, k -> new HashSet<>()).add(userId);
userToFiles.computeIfAbsent(userId, k -> new HashSet<>()).add(fileId);
}
public void shareFile(int fromUserId, int toUserId, int fileId) {
if (userToFiles.getOrDefault(fromUserId, Collections.emptySet()).contains(fileId)) {
downloadFile(toUserId, fileId);
}
}
public Set<Integer> listUserFiles(int userId) {
return userToFiles.getOrDefault(userId, Collections.emptySet());
}
public Set<Integer> listFileUsers(int fileId) {
return fileToUsers.getOrDefault(fileId, Collections.emptySet());
}
public List<Integer> getAllFileIds() {
return fileToUsers.keySet().stream().collect(Collectors.toList());
}
}
解释
方法:
这个题解使用哈希表 user_chunks 来记录每个用户拥有的文件块编号。当用户加入时,如果有之前离开的用户,则复用其 ID,否则分配一个新的 ID。当用户离开时,将其 ID 加入重用 ID 的小顶堆 reused 中。当用户请求一个文件块时,遍历所有用户,找到拥有该文件块的用户 ID,返回其有序列表,并将该文件块编号加入请求用户的拥有列表中。
时间复杂度:
O(n + k log k)
空间复杂度:
O(n * m)
代码细节讲解
🦆
在`join`方法中,如果存在多个重用的用户 ID,选择哪一个重用的 ID 是基于什么标准?为什么选择使用小顶堆来管理这些 ID?
▷🦆
在`leave`方法中,当用户离开时你选择立即删除该用户的文件块记录。这种设计是否会影响到正在进行的`request`操作?如果是,如何避免这种情况?
▷🦆
对于`request`方法,如果一个用户请求一个他已经拥有的文件块,这样的设计是否会导致不必要的重复记录?是否有方法可以优化这一点?
▷🦆
在实例化FileSharing类时,初始参数m代表文件块总数。这个参数在后续操作中有何具体作用?是否有机制确保不会请求超出总数的文件块?
▷