Untitled
Interview: Dhruvunknown
python
2 years ago
1.8 kB
3
Indexable
from collections import deque from collections import defaultdict logs = [ { 'user': '1', 'page': 'A'}, { 'user': '2', 'page': 'B'}, { 'user': '1', 'page': 'B'}, { 'user': '1', 'page': 'D'}, { 'user': '2', 'page': 'A'}, { 'user': '3', 'page': 'B'}, { 'user': '3', 'page': 'D'}, { 'user': '1', 'page': 'C'}, { 'user': '3', 'page': 'C'}, { 'user': '1', 'page': 'C'}, { 'user': '2', 'page': 'C'}, { 'user': '3', 'page': 'B'}, { 'user': '1', 'page': 'A'}, { 'user': '3', 'page': 'C'}, { 'user': '4', 'page': 'B'}, { 'user': '4', 'page': 'A'}, { 'user': '4', 'page': 'C'}, ] # We need to find the sequence of pages of length 3, that is the most popular. # The most popular is BDC, since user 1 and user 3 visit that sequence # n = len(logs) # (nlogn) def find_popular_grp(logs): if len(logs) == 0: return None user = defaultdict(deque) count = defaultdict(int) # most_popular_grp = None highest_count = 0 for log in logs: user_id = int(log['user']) page_id = log['page'] user[user_id].append(page_id) if len(user[user_id]) > 3 : user[user_id].popleft() if len(user[user_id]) < 3: continue page_grp = "".join(user[user_id]) count[page_grp] += 1 if count[page_grp] > highest_count: highest_count = count[page_grp] count_lst = list(count.items()) count_lst.sort(key = lambda pair: pair[1], reverse=True) res = [count_lst[0][0]] for i in range(1, len(count_lst)): if count_lst[i][1] < count_lst[i-1][1]: break else: res.append(count_lst[i][0]) if len(res) == len(count_lst): return None else: return res print(find_popular_grp(logs))
Editor is loading...