Skip to content

Commit 20ae1a0

Browse files
committed
355_Design_Twitter
1 parent abb903e commit 20ae1a0

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import Foundation
2+
3+
class Twitter {
4+
5+
var userIDAndTweetMap = [Int:[(Int, Int)]]()
6+
var followerAndfolloweeMap = [Int:Set<Int>]() // [follower: Set<followee>]
7+
let maxPost = 10
8+
var currentTimeRef = 10000
9+
10+
init() {
11+
12+
}
13+
14+
func postTweet(_ userId: Int, _ tweetId: Int) {
15+
currentTimeRef += 1
16+
17+
// add tweet to user's feed
18+
userIDAndTweetMap[userId, default: [(Int, Int)]()].append((tweetId, currentTimeRef))
19+
if userIDAndTweetMap[userId]!.count > maxPost {
20+
userIDAndTweetMap[userId]!.removeFirst()
21+
}
22+
}
23+
24+
func getNewsFeed(_ userId: Int) -> [Int] {
25+
var allFeeds = [(Int, Int)]()
26+
27+
if let feeds = userIDAndTweetMap[userId] {
28+
allFeeds.append(contentsOf: feeds)
29+
}
30+
31+
if let followeeIds = followerAndfolloweeMap[userId] {
32+
for followeeId in Array(followeeIds) {
33+
if let feeds = userIDAndTweetMap[followeeId] {
34+
allFeeds.append(contentsOf: feeds)
35+
}
36+
}
37+
}
38+
allFeeds.sort { $0.1 > $1.1 }
39+
let feeds = allFeeds.map { $0.0 }
40+
41+
return feeds.count <= maxPost ? feeds : Array(feeds[0..<10])
42+
}
43+
44+
func follow(_ followerId: Int, _ followeeId: Int) {
45+
followerAndfolloweeMap[followerId, default: Set<Int>()].insert(followeeId)
46+
}
47+
48+
func unfollow(_ followerId: Int, _ followeeId: Int) {
49+
followerAndfolloweeMap[followerId]?.remove(followeeId)
50+
}
51+
}
52+
53+
/**
54+
* Your Twitter object will be instantiated and called as such:
55+
* let obj = Twitter()
56+
* obj.postTweet(userId, tweetId)
57+
* let ret_2: [Int] = obj.getNewsFeed(userId)
58+
* obj.follow(followerId, followeeId)
59+
* obj.unfollow(followerId, followeeId)
60+
*/

0 commit comments

Comments
 (0)