三、用户网站访问行为分析(Biweekly6)

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

为了方便分析,日志文件中的 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”)。

我弄的比较复杂了
参考别人的代码:我加上了注释

class Solution {
		public List<String> mostVisitedPattern(String[] username, int[] timestamp, String[] website) {
			// 保存返回的结果
			List<String> res = new ArrayList<>();
			int n = username.length;
			// 保存所有出现的用户
			Set<String> users = new HashSet<>();
			// 初始化users,将所有的用户种类加入到users
			for (String user : username)
				users.add(user);
//			保存所有出现的访问的网站和时间戳,按照的是时间访问的,以,分隔
			List<Set<String>> visited = new ArrayList<>();
			
//			对于每一个user进行操作
			for (String user : users) {
				visited.add(visit(user, username, timestamp, website));
			}
			TreeMap<String, Integer> map = new TreeMap<>();
			for (Set<String> set : visited) {
				for (String u : set) {
					map.put(u, map.getOrDefault(u, 0) + 1);
				}
			}
			int max = 0;
			for (Map.Entry<String, Integer> entry : map.entrySet()) {
				if (entry.getValue() > max) {
					max = entry.getValue();
					res = new ArrayList<>();
					for (String s : entry.getKey().split(",")) {
						if (s.length() != 0)
							res.add(s);
					}
				}
			}
			return res;
		}
		private Set<String> visit(String user, String[] username, int[] timestamp, String[] website) {
//			按照时间戳进行排序,存放的是时间戳,访问的路径
			PriorityQueue<String[]> q = 
					new PriorityQueue<>((a, b) -> 
					Integer.valueOf(a[0]) - Integer.valueOf(b[0]));
			for (int i = 0; i < username.length; i++) {
				if (!user.equals(username[i]))
					continue;
				q.offer(new String[] { String.valueOf(timestamp[i]), website[i] });
			}
			Set<String> one = new HashSet<>(), two = new HashSet<>(), res = new HashSet<>();
			while (!q.isEmpty()) {
//				取出访问路径,每三个组成一个
				String cur = q.poll()[1];
				for (String t : two)
					res.add(t + "," + cur);
				for (String o : one)
					two.add(o + "," + cur);
				one.add(cur);
			}
			return res;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值