设计视频共享平台
难度:
标签:
题目描述
代码结果
运行时间: 326 ms, 内存: 86.4 MB
/*
* 思路:
* 设计一个视频共享平台, 需要实现以下功能:
* 1. 上传视频:用户可以上传视频,并给视频一个唯一的ID。
* 2. 获取视频:通过ID获取视频内容。
* 3. 删除视频:删除指定ID的视频。
* 4. 记录观看次数:记录视频的观看次数。
* 使用Java Stream进行一些操作,如过滤视频ID等。
*/
import java.util.HashMap;
import java.util.Optional;
import java.util.stream.Collectors;
class VideoSharingPlatformStream {
private static int idCounter = 1; // 用于生成唯一ID
private HashMap<Integer, String> videos; // 用于存储视频ID和视频内容的映射
private HashMap<Integer, Integer> views; // 用于存储视频ID和观看次数的映射
public VideoSharingPlatformStream() {
videos = new HashMap<>();
views = new HashMap<>();
}
// 上传视频,并返回视频的ID
public int uploadVideo(String content) {
int id = idCounter++;
videos.put(id, content);
views.put(id, 0); // 初始化观看次数为0
return id;
}
// 通过ID获取视频内容
public Optional<String> getVideo(int id) {
return Optional.ofNullable(videos.get(id));
}
// 删除视频
public void deleteVideo(int id) {
videos.remove(id);
views.remove(id);
}
// 记录观看视频的次数
public void watchVideo(int id) {
views.put(id, views.getOrDefault(id, 0) + 1);
}
// 获取视频观看次数
public int getViews(int id) {
return views.getOrDefault(id, 0);
}
// 获取所有观看次数大于特定值的视频ID
public List<Integer> getPopularVideos(int minViews) {
return views.entrySet().stream()
.filter(entry -> entry.getValue() > minViews)
.map(entry -> entry.getKey())
.collect(Collectors.toList());
}
}
解释
方法:
该题解设计了一个简单的视频共享平台,包含视频上传、删除、观看、点赞、点踩、获取点赞点踩数和观看次数的功能。其中,使用了一个字典来存储视频ID和视频对象的映射,以及一个最小堆来管理回收使用过的视频ID。每个视频对象有自己的ID、数据内容、观看次数、点赞数和点踩数。上传视频时,如果有回收的ID就使用,否则新分配一个。删除视频时,将其从字典中删除并将ID放入最小堆。观看视频时,更新观看次数并返回请求的视频片段。点赞和点踩功能分别更新视频对象的对应计数器。
时间复杂度:
O(log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在删除视频时,如何处理已经有观看记录的视频?是否有机制保证删除操作的安全性,比如避免在观看过程中删除视频?
▷🦆
为什么选择使用最小堆来管理回收的视频ID,而不是其他数据结构如栈或队列?
▷🦆
视频上传功能中,当从最小堆中回收ID时,如何确保该ID确实是已被删除的视频ID,而不是在使用中的ID?
▷