leetcode
leetcode 2001 ~ 2050
设计视频共享平台

设计视频共享平台

难度:

标签:

题目描述

代码结果

运行时间: 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总是最小可用的ID。这有助于保持ID的紧凑分配,避免ID数值无限增长。如果使用栈或队列,则可能导致新视频获得较大的ID,即使存在更小的可用ID,从而导致ID的使用不够经济和有效。最小堆每次都能以对数时间复杂度提供最小元素,保证了效率和ID使用的最优化。
🦆
视频上传功能中,当从最小堆中回收ID时,如何确保该ID确实是已被删除的视频ID,而不是在使用中的ID?
在设计中,只有在删除视频对象后,该视频的ID才会被添加到最小堆中。这个操作保证了所有在最小堆中的ID都是已经从字典中移除的,因此这些ID对应的视频已被删除。在上传视频时,从最小堆中取出的ID再次被使用之前,会从堆中移除并加入到字典中,这个过程保证了ID的唯一性和一致性,避免了ID的重复使用。

相关问题