[leetcode 双周赛 6] 1152 用户网站访问行为分析

2023-11-06

1152 Analyze User Website Visit Pattern 用户网站访问行为分析

描述

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

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

  • 提示:

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

思路

暴力枚举每个用户的顺序网页访问路径(有三个页面)
选出访问路径出现最多次数的那个 或者 字典序排列最小的那个
1640888-20190814001627496-1847533616.png

代码实现

重要存储结构示意图如下:
1640888-20190814002502713-1170942975.png

暴力枚举每一用户访问路径并投票

class Solution {
    public List<String> mostVisitedPattern(String[] username, int[] timestamp, String[] website) {
        // utwRecords 根据用户名username组合三个数组 <username, <timestamp, website>>
        // 注意内部使用TreeMap 是为了排序 时间戳timestamp的按顺序排列
        HashMap<String, TreeMap<Integer, String>> utwRecords = new HashMap<>();
        for (int i = 0; i < username.length; i++) {
            if (!utwRecords.containsKey(username[i])) {
                utwRecords.put(username[i], new TreeMap<Integer, String>());
            }
            utwRecords.get(username[i]).put(timestamp[i], website[i]);
        }

        // uwRecords 提取utwRecords中除时间戳timestamp的数据 
        // 用户名username以及对应访问的网页website(按时间戳排序)
        HashMap<String, ArrayList<String>> uwRecords = new HashMap<>();
        for (String name : utwRecords.keySet()) {
            uwRecords.put(name, new ArrayList<String>());
            for (Integer time : utwRecords.get(name).keySet()) {
                uwRecords.get(name).add(utwRecords.get(name).get(time));
            }
        }

        // cntWP 存储所枚举的每一条网页访问路径 并计录其出现的次数
        // <网页访问路径(3个网页名称合成1条字符串), 出现次数>
        HashMap<String, Integer> cntWP = new HashMap<>();
        // maxCnt 网页访问路径出现最多次数为
        int maxCnt = 0;
        // res 最多次数的网页访问路径(3个网页名称合成1条字符串)
        String res = new String();
        for (String name : uwRecords.keySet()) {
            // len 当前用户所访问的网页数
            int len = uwRecords.get(name).size();
            // single 存储当前用户所访问网页的访问路径 并去重
            HashSet<String> single = new HashSet<>();
            for (int i = 0; i < len-2; i++) {
                for (int j = i+1; j < len-1; j++) {
                    for (int k = j+1; k < len; k++) {
                        // 网页访问路径格式: A-->B-->C
                        String cur = (new StringBuilder()).append(uwRecords.get(name).get(i))
                        .append("->")
                        .append(uwRecords.get(name).get(j))
                        .append("->")
                        .append(uwRecords.get(name).get(k)).toString();
                        single.add(cur);
                    }
                }
            }

            // 遍历当前用户所访问网络的路径 存储并给访问路径计数
            for (String str : single) {
                if (!cntWP.containsKey(str)) {
                    cntWP.put(str, 0);
                }
                cntWP.put(str, cntWP.get(str)+1);

                int curCnt = cntWP.get(str);
                // 当该访问路径出现次数curCnt大于最大访问次数maxCnt 
                //      那么结果路径res就是该路径
                // 或者
                // 当该访问路径出现次数curCnt等于最大访问次数maxCnt 且字典序小于原出现次数最多的路径res 
                //      那么结果路径res就是该路径
                if (curCnt > maxCnt | (curCnt == maxCnt && str.compareTo(res) < 0)) {
                    maxCnt = curCnt;
                    res = str;
                }
            }
        }

        // ans 存储所求结果访问路径的3个网页
        // 其实也可以使用 Arrays.asList(res.split("->"))
        ArrayList<String> ans = new ArrayList<>();
        for (String str : res.split("->")) {
            ans.add(str);
        }

        return ans;
    }
}

转载于:https://www.cnblogs.com/slowbirdoflsh/p/11349461.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[leetcode 双周赛 6] 1152 用户网站访问行为分析 的相关文章

  • 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文 http blog csdn net sup heaven article details 39313731 数据结构中常见的树 BST二叉搜索树 AVL平衡二叉树 RBT红黑树 B 树 B 树 B 树 转载 2014年09月16日
  • BP神经网络与Python实现

    人工神经网络是一种经典的机器学习模型 随着深度学习的发展神经网络模型日益完善 联想大家熟悉的回归问题 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数 并使用该函数进行预测 网络的训练过程即为调节该函数参数提高预测精度的过程
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • 数据结构之图的两种遍历实现(C语言版)

    上一期文章分享完了图的两种遍历方式 也是两种很重要的算法 DFS和BFS 这两种算法的应用和重要性我就不多说了 内行的人懂的都懂 今天这文章重要就是来上机实现这两种算法 又由于这两种算法都可以由邻接矩阵和邻接表来表示 博主分享的代码都是上机
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • 字符串09--表示数值的字符串

    字符串09 表示数值的字符串 jz53 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • 数据结构——计算节点个数和二叉树高度(C语言版)

    摘自 数据结构 计算节点个数和二叉树高度 C语言版 作者 正弦定理 发布时间 2020 12 12 23 27 09 网址 https blog csdn net chinesekobe article details 111086664
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • 浮生六记

    浮生六记 目录 浮生六记卷一 闺房记乐 002 浮生六记卷二 闲情记趣 015 浮生六记卷三 坎坷记愁 022 浮生六记卷四 浪游记快 034 浮生六记 2 浮生六记卷一 闺房记乐 余生乾隆癸未冬十一月二十有二日 正值太平盛世 且在 衣冠之
  • 算法问题实战策略

    算法问题实战策略 基本信息作者 韩 具宗万 译者 崔盛一出版社 人民邮电出版社ISBN 9787115384621上架时间 2015 2 4出版日期 2015 年3月开本 16开页码 738版次 1 1 内容简介 算法问题实战策略 本书收录
  • 人工智能概念

    人工智能概念 人工智能就是用人工方法在机器 计算机 上实现的智能 或称机器智能 即是研究如何用计算机来表示和执行人类的智能活动 以模拟人脑所从事的推理 学习 思考和规划等思维活动 并解决需要人类的智力才能处理的复杂问题 如医疗诊断 管理决策
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值

随机推荐

  • Python深度学习与机器视觉(一)

    1 1 深度学习与机器学习区别 1 2深度学习应用领域 1 3深度学习学习框架 1 4TensorFlow结构 1 4 1案例 TensorFlow实现一个加法运算 1 4 2TensorFlow结构分析 1 4 3图 1 4 4Tenso
  • 修改openwrt或者LEDE默认wifi名称以及默认开启wifi

    修改文件为mac80211 sh 默认位置在 lede package kernel mac80211 files lib wifi 将set wireless radio devidx disabled 1 修改为 set wireles
  • VS写Qt项目时,ui界面拖拽的控件代码找不到引用的解决办法

    最近准备尝试用VS去开发Qt项目 但是我在ui文件中修改的控件 在vs里面找不到 于是上网浏览解决办法 总结如下 1 保存Ui文件 在拖拽控件之后 Ctrl S 2 重新编译ui文件 3 右键项目 重新扫描解决方案 这样就可以啦 话说真的好
  • 独家

    作者 Abhijit Telang 翻译 张睿毅 校对 丁楠雅 本文约2600字 建议阅读10分钟 本文介绍了做残差分析的方法及其重要性 以及利用R语言实现残差分析 在这篇文章中 我们通过探索残差分析和用R可视化结果 深入研究了R语言 残差
  • 软件测试工程师该如何规划自己的职业发展道路?

    软件测试 行业也在如火如荼的发展壮大 现在的 互联网 以及其他传统公司都需要大批量的软件测试人员 但是软件测试人员的职业规划也是值得我们深度思考的 大家都比较看好软件测试行业 只是因为表面上看起来 钱多事少加班少 其实这个都是针对个人运气好
  • ros-服务数据的定义与使用

    ros 服务数据的定义与使用 步骤 1 定义srv文件 在learning service文件夹下创建srv 在srv下创建person srv文件 2 在package xml中添加功能包依赖
  • 90后MIT博士开源创业再获5千万美元融资,进军3D数字内容创作者工具

    信息技术奥林匹克大赛获奖 保送清华姚班 麻省理工博士 创业公司CEO 这一组词汇对于大多数人来说仿佛都是可望而不可及的存在 个个都是如此地令人惊叹 随便沾上一个就能走上人生巅峰 但是偏偏能有这么一个人 集 巅峰 于一身 那就是 太极图形 创
  • APISIX Dashboard中文文档(一)

    2022年7月6日13 24 56 APISIX Dashboard中文文档 一 APISIX Dashboard中文文档 二 APISIX Dashboard中文文档 三 官方文档 https apisix apache org zh d
  • 51单片机中断系统的原理和运用

    QX MCS51开发板上使用的是DIP封装 双列直插式 有40只引脚 40只引脚按其功能来分 有三类 一 电源和时钟引脚 Vcc Vss XTAL1 XTAL2 电源引脚接入单片机工作电源 Vcc 40脚 接 5V电源 Vss 20脚 接地
  • java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒

    Java程序将毫秒转换为分钟和秒 在上面的程序中 您将学习如何在Java中将毫秒分别转换为分钟和秒 示例1 将毫秒分别转换为分钟和秒 import java util concurrent TimeUnit public class Mil
  • 【Qt】错误:‘connect‘ was not declared in this scope 解决方法

    这种错误主要出现在在非继承QObject的类中或者一般函数中使用connect导致 原因是connect是QObject的一个static方法 将connet替换为QObject connect即可
  • BUUCTF-随便注、Exec、EasySQL、Secret File

    目录 强网杯 2019 随便注 ACTF2020 新生赛 Exec SUCTF 2019 EasySQL 极客大挑战 2019 Secret File 强网杯 2019 随便注 打开场景 里面有输入框 上面自带一个1 点击提交 有回显 输入
  • 毕业设计 基于单片机的双足机器人

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • starRocks配置两个数据源的多个IP进行访问数据库查询

    1 yml文件配置 注意mysql为master datasource mysql master type com alibaba druid pool DruidDataSource driver class name com mysql
  • 手把手教你如何使用Fiddler及使用图文详解

    01 什么是 Fiddler Fiddler 是一个 HTTP 协议调试代理工具 它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯 Fiddler 提供了电脑端 移动端的抓包 包括 http 协议和 https 协议都可以捕获到报
  • linux中如何修改文件夹的用户权限

    linux中如何修改文件夹权限 linux中 可以使用chown命令来修改文件夹的用户权限 环境 windows 7 virtualbox fedora 15 kde 下面举例给出 1 以普通用户admin登录linux 利用su 切换到r
  • MySQL数据库基本操作-正则表达式

    文章目录 一 基本介绍 二 的用法 三 的用法 四 的用法 五 和 的用法 六 和 的用法 七 的用法 八 的用法 九 的用法 一 基本介绍 正则表达式 regularexpression 描述了一种字符串匹配的规则 正则表达式本身就是一个
  • SpringMVC-整合SSM框架(狂神学习笔记)2021-10-03

    SpringMVC 狂神 整合SSM框架 1 整合SSM 1 环境要求 环境 IDEA Eclipse MySQL 5 7 Tomcat 9 Maven 3 6 要求 需要熟练掌握MySQL数据库 Spring JavaWeb及MyBati
  • day01(Flume)

    简介 一 概述 Flume是Apache提供的一套用于进行日志收集 汇聚和传输的框架 2 Flume的版本 Flume ng 和Flume og 不兼容 a Flume1 x Flume ng b Flume0 X Flume og htt
  • [leetcode 双周赛 6] 1152 用户网站访问行为分析

    目录 1152 Analyze User Website Visit Pattern 用户网站访问行为分析 描述 思路 代码实现 1152 Analyze User Website Visit Pattern 用户网站访问行为分析 描述 为