Leetcode 1152:用户网站访问行为分析(超详细的解法!!!)
发布日期:2021-06-29 16:06:18 浏览次数:2 分类:技术文章

本文共 2238 字,大约阅读时间需要 7 分钟。

为了评估某网站的用户转化率,我们需要对用户的访问行为进行分析,并建立用户行为模型。日志文件中已经记录了用户名、访问时间 以及 页面路径。

为了方便分析,日志文件中的 N 条记录已经被解析成三个长度相同且长度都为 N 的数组,分别是:用户名 username,访问时间 timestamp 和 页面路径 website。第 i 条记录意味着用户名是 username[i] 的用户在 timestamp[i] 的时候访问了路径为 website[i] 的页面。

我们需要找到用户访问网站时的 『共性行为路径』,也就是有最多的用户都 至少按某种次序访问过一次 的三个页面路径。需要注意的是,用户 可能不是连续访问 这三个路径的。

『共性行为路径』是一个 长度为 3 的页面路径列表,列表中的路径 不必不同,并且按照访问时间的先后升序排列。

如果有多个满足要求的答案,那么就请返回按字典序排列最小的那个。(页面路径列表 X 按字典序小于 Y 的前提条件是:X[0] < Y[0]X[0] == Y[0] 且 (X[1] < Y[1] 或 X[1] == Y[1] 且 X[2] < Y[2])

题目保证一个用户会至少访问 3 个路径一致的页面,并且一个用户不会在同一时间访问两个路径不同的页面。

示例:

输入:username = ["joe","joe","joe","james","james","james","james","mary","mary","mary"], timestamp = [1,2,3,4,5,6,7,8,9,10], website = ["home","about","career","home","cart","maps","home","home","about","career"]输出:["home","about","career"]解释:由示例输入得到的记录如下:["joe", 1, "home"]["joe", 2, "about"]["joe", 3, "career"]["james", 4, "home"]["james", 5, "cart"]["james", 6, "maps"]["james", 7, "home"]["mary", 8, "home"]["mary", 9, "about"]["mary", 10, "career"]有 2 个用户至少访问过一次 ("home", "about", "career")。有 1 个用户至少访问过一次 ("home", "cart", "maps")。有 1 个用户至少访问过一次 ("home", "cart", "home")。有 1 个用户至少访问过一次 ("home", "maps", "home")。有 1 个用户至少访问过一次 ("cart", "maps", "home")。

提示:

  1. 3 <= N = username.length = timestamp.length = website.length <= 50
  2. 1 <= username[i].length <= 10
  3. 0 <= timestamp[i] <= 10^9
  4. 1 <= website[i].length <= 10
  5. username[i]website[i] 都只含小写字符

解题思路

这个问题首先不难想到暴力解法,我们可以现将[username,timestamp,website]按照这种方式将元素排序(这样就可以保证所有相同姓名的元素按照timestamp排在一起)。然后我们可以暴力枚举相同姓名的人所有访问的website的组合方式,我们可以通过itertools.combinations轻松实现这一点。接着就是建立一个字典,将相同website组合的人添加进去。最后我们只要按照所有website组合的人数去排列,我们选择人数最多的那个website组合即可。

class Solution:    def mostVisitedPattern(self, username: List[str], timestamp: List[int], website: List[str]) -> List[str]:        data = [[username[i], timestamp[i], website[i]] for i in range(len(username))]        data.sort()        d = collections.defaultdict(list)        for u, t, w in data:            d[u].append(w)                res = collections.defaultdict(set)        for i, v in d.items():            for j in itertools.combinations(v, 3):                res[j].add(i)        return sorted(res.items(), key=lambda a:(-len(a[1]), a[0]))[0][0]

我将该问题的其他语言版本添加到了我的

如有问题,希望大家指出!!!

转载地址:https://coordinate.blog.csdn.net/article/details/99209763 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Leetcode 1154:一年中的第几天(超详细的解法!!!)
下一篇:Leetcode 1151:最少交换次数来组合所有的 1(超详细的解法!!!)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 05时16分35秒