- Difficulty: Hard
- Tags: LeetCode, Hard, Stack, Design, Hash Table, Ordered Set, leetcode-2254, O(n * l), 🔒, Heap
Problem
You have a video sharing platform where users can upload and delete videos. Each video
is a string of digits, where the ith
digit of the string represents the content of the video at minute i
. For example, the first digit represents the content at minute 0
in the video, the second digit represents the content at minute 1
in the video, and so on. Viewers of videos can also like and dislike videos. Internally, the platform keeps track of the number of views, likes, and dislikes on each video.
When a video is uploaded, it is associated with the smallest available integer videoId
starting from 0
. Once a video is deleted, the videoId
associated with that video can be reused for another video.
Implement the VideoSharingPlatform
class:
VideoSharingPlatform()
Initializes the object.int upload(String video)
The user uploads avideo
. Return thevideoId
associated with the video.void remove(int videoId)
If there is a video associated withvideoId
, remove the video.String watch(int videoId, int startMinute, int endMinute)
If there is a video associated withvideoId
, increase the number of views on the video by1
and return the substring of the video string starting atstartMinute
and ending atmin(endMinute, video.length - 1
)
(inclusive). Otherwise, return"-1"
.void like(int videoId)
Increases the number of likes on the video associated withvideoId
by1
if there is a video associated withvideoId
.void dislike(int videoId)
Increases the number of dislikes on the video associated withvideoId
by1
if there is a video associated withvideoId
.int[] getLikesAndDislikes(int videoId)
Return a 0-indexed integer arrayvalues
of length2
wherevalues[0]
is the number of likes andvalues[1]
is the number of dislikes on the video associated withvideoId
. If there is no video associated withvideoId
, return[-1]
.int getViews(int videoId)
Return the number of views on the video associated withvideoId
, if there is no video associated withvideoId
, return-1
.
Â
Example 1:
Input ["VideoSharingPlatform", "upload", "upload", "remove", "remove", "upload", "watch", "watch", "like", "dislike", "dislike", "getLikesAndDislikes", "getViews"] [[], ["123"], ["456"], [4], [0], ["789"], [1, 0, 5], [1, 0, 1], [1], [1], [1], [1], [1]] Output [null, 0, 1, null, null, 0, "456", "45", null, null, null, [1, 2], 2] Explanation VideoSharingPlatform videoSharingPlatform = new VideoSharingPlatform(); videoSharingPlatform.upload("123"); // The smallest available videoId is 0, so return 0. videoSharingPlatform.upload("456"); // The smallest availablevideoId
is 1, so return 1. videoSharingPlatform.remove(4); // There is no video associated with videoId 4, so do nothing. videoSharingPlatform.remove(0); // Remove the video associated with videoId 0. videoSharingPlatform.upload("789"); // Since the video associated with videoId 0 was deleted, // 0 is the smallest availablevideoId
, so return 0. videoSharingPlatform.watch(1, 0, 5); // The video associated with videoId 1 is "456". // The video from minute 0 to min(5, 3 - 1) = 2 is "456", so return "456". videoSharingPlatform.watch(1, 0, 1); // The video associated with videoId 1 is "456". // The video from minute 0 to min(1, 3 - 1) = 1 is "45", so return "45". videoSharingPlatform.like(1); // Increase the number of likes on the video associated with videoId 1. videoSharingPlatform.dislike(1); // Increase the number of dislikes on the video associated with videoId 1. videoSharingPlatform.dislike(1); // Increase the number of dislikes on the video associated with videoId 1. videoSharingPlatform.getLikesAndDislikes(1); // There is 1 like and 2 dislikes on the video associated with videoId 1, so return [1, 2]. videoSharingPlatform.getViews(1); // The video associated with videoId 1 has 2 views, so return 2.
Example 2:
Input ["VideoSharingPlatform", "remove", "watch", "like", "dislike", "getLikesAndDislikes", "getViews"] [[], [0], [0, 0, 1], [0], [0], [0], [0]] Output [null, null, "-1", null, null, [-1], -1] Explanation VideoSharingPlatform videoSharingPlatform = new VideoSharingPlatform(); videoSharingPlatform.remove(0); // There is no video associated with videoId 0, so do nothing. videoSharingPlatform.watch(0, 0, 1); // There is no video associated with videoId 0, so return "-1". videoSharingPlatform.like(0); // There is no video associated with videoId 0, so do nothing. videoSharingPlatform.dislike(0); // There is no video associated with videoId 0, so do nothing. videoSharingPlatform.getLikesAndDislikes(0); // There is no video associated with videoId 0, so return [-1]. videoSharingPlatform.getViews(0); // There is no video associated with videoId 0, so return -1.
Â
Constraints:
1 <= video.length <= 105
- The sum of
video.length
over all calls toupload
does not exceed105
video
consists of digits.0 <= videoId <= 105
0 <= startMinute < endMinute < 105
startMinute < video.length
- The sum of
endMinute - startMinute
over all calls towatch
does not exceed105
. - At most
105
calls in total will be made to all functions.