LeetCode 550, 380, 234

目录

  • 550. 游戏玩法分析 IV
    • 题目链接
    • 要求
    • 知识点
    • 思路
    • 代码
  • 380. O(1) 时间插入、删除和获取随机元素
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 234. 回文链表
    • 题目链接
    • 标签
    • 思路
    • 代码

550. 游戏玩法分析 IV

题目链接

550. 游戏玩法分析 IV

  • Activity的字段为player_iddevice_idevent_dategames_played

要求

  • 编写解决方案,报告在首次登录的第二天再次登录的玩家的 比率,四舍五入到小数点后两位。换句话说,你需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。

知识点

  1. round():四舍五入函数。
  2. count():统计数量函数。
  3. min():取最小值函数。
  4. date_add():将一个日期加上指定时间的函数,它的第二个参数通常有interval作为前缀,表示间隔。例如date_add('2020-1-20', interval 1 day)表示2020-1-21
  5. distinct:将某个字段的重复值去除(去重)。例如num的取值有1, 1, 2, 4, 5,则distinct num的结果为1, 2, 4, 5count(distinct num)的结果为4
  6. 子查询:将查询的结果作为表进行查询。

思路

要求中明确提出了要先查找连续两天登录的玩家,然后再获取这些玩家的数量,最后获取玩家的总数,再用前者除以后者即可。要注意的是表中玩家的id可能重复,所以在统计数量时需要使用distinct来去重。

代码

对于获取连续两天登录的玩家数量,有以下的sql语句,其中num就是连续两天登录的玩家数量:

selectcount(distinct ss.player_id) num
fromActivity a,(selectplayer_id,date_add(min(event_date), interval 1 day) second_datefromActivitygroup byplayer_id) ss
wherea.player_id = ss.player_id
anda.event_date = ss.second_date

总体的sql语句如下:

selectround(s.num / count(distinct a.player_id), 2) fraction
fromActivity a,(selectcount(distinct ss.player_id) numfromActivity a,(selectplayer_id,date_add(min(event_date), interval 1 day) second_datefromActivitygroup byplayer_id) sswherea.player_id = ss.player_idanda.event_date = ss.second_date) s

380. O(1) 时间插入、删除和获取随机元素

题目链接

380. O(1) 时间插入、删除和获取随机元素

标签

设计 数组 哈希表 数学 随机化

思路

对于 O ( 1 ) O(1) O(1)时间复杂度的插入、删除元素,一般都能想到使用哈希表的方法,不熟悉哈希表的可以去看我写的这篇博客——数据结构——哈希表。本题只需要使用一个链表用来存储元素,再使用哈希表HashMap来映射元素和它的下标,最后使用随机类Random来获取随机下标。

  • 对于插入,先检查待插入元素是否在数组中存在,如果存在,就不添加,并且返回false;否则将其放在链表末尾,并建立它的值与下标的映射。
  • 对于删除,先检查待插入元素是否在数组中存在,如果不存在,就不删除,并且返回false;否则让链表的最后一个元素覆盖待删除元素,修改最后一个元素的值与下标的映射,并移除 待删除元素 和 它的值与下标的映射。
  • 对于随机访问,可以使用java.util.Random类的random()方法来生成,给random()方法传入链表的长度即可返回一个范围为[0, 链表长度)的随机下标。

代码

class RandomizedSet {public RandomizedSet() {}public boolean insert(int val) {// 1. 如果存在这个元素,则返回fasleif (exist(val)) {return false;}// 2. 将每个元素都存放在链表的末尾,它的下标就是此时链表的长度int index = data.size();data.add(val);// 3. 建立元素的值与下标的映射indices.put(val, index);return true;}public boolean remove(int val) {// 1. 如果不存在这个元素,则返回falseif (!exist(val)) {return false;}// 2. 通过映射获取这个元素在链表的下标int index = indices.get(val);// 3. 获取链表最后一个元素的下标和它的值int lastIndex = data.size() - 1;int last = data.get(lastIndex);// 4. 用最后一个元素覆盖待删除元素data.set(index, last);// 5. 修改最后一个元素的下标为待删除元素的下标indices.put(last, index);// 6. 移除此时的最后一个元素,也就是待删除元素data.remove(lastIndex);// 7. 移除待删除元素的值与下标的映射indices.remove(val);return true;}public int getRandom() {return data.get(random.nextInt(data.size()));}// 判断元素是否在data中存在,即判断这个元素是否有下标private boolean exist(int val) {return indices.containsKey(val);}/*** 存储元素*/private final List<Integer> data = new ArrayList<>();/*** 映射元素和它的下标,key为元素的值,value为元素的下标*/private final Map<Integer, Integer> indices = new HashMap<>();/*** 用来生成随机的下标*/private final Random random = new Random();}

234. 回文链表

题目链接

234. 回文链表

标签

栈 递归 链表 双指针

思路

把链表分成两部分,然后反转前半部分,对比这两部分是否完全相同,如果有一个值不相同,则返回false。

如何把链表分为两部分?很简单,用两个指针,慢指针每次走一格slow = slow.next,快指针每次走两格fast = fast.next.next,直到fast == null || fast.next == null为止,最后的慢指针可能指向链表后半部分的头部。当fast == null作为结束条件时,说明链表的节点数为偶数,慢指针指向链表后半部分的头部;当fast.next == null作为结束条件时,说明链表的节点数为奇数,此时需要将慢指针向后移一格,之后的慢指针才指向链表后半部分的头部。

如何反转链表?很简单,用三个指针new1, old1, old2,它们分别代表新链表的头节点旧链表的前一个节点旧链表的后一个节点,用old1从待反转链表的头部开始一直向后遍历,直到指向null,每次都先用old2保存old1的下一个节点,然后再让old1指向new1(这步就是反转链表的关键,新链表是从尾部向头部建的,每次都往新链表的头部添加一个节点),接着将old1赋值给new1,最后将old2赋值给old1。代码如下:

public ListNode reverseList(ListNode head) {ListNode new1 = null, old1 = head;while (old1 != null) {ListNode old2 = old1.next;old1.next = new1;new1 = old1;old1 = old2;}return old1;
}

注意:本题的题解并没有明确写出用来反转链表的方法,而是将反转链表的操作与划分链表的操作合二为一。

代码

class Solution {public boolean isPalindrome(ListNode head) {ListNode slow = head; // 慢指针,反转完之后指向链表后半部分的头节点ListNode fast = head; // 快指针ListNode old1 = head; // 用于反转的指向旧值的指针ListNode new1 = null; // 用于反转的指向新值的指针,反转完之后指向前半部分的头节点// 1. 将链表的前半部分反转while (fast != null && fast.next != null) {fast = fast.next.next; // 快指针每次走两格slow = slow.next; // 慢指针每次走一格// 反转链表前半部分的某个节点,此处利用了反转链表的思想old1.next = new1;new1 = old1;// 更新old1的值old1 = slow;}// 2. 如果是奇数个节点,则少比较一次,让slow指向下一个节点if (fast != null) {slow = slow.next;}// 3. 比较 前半部分的反向链表 和 后半部分的链表 是否一模一样while (new1 != null) {// 如果有一个值不一样,则返回falseif (new1.val != slow.val) {return false;}slow = slow.next;new1 = new1.next;}// 4. 所有值都一样了,返回truereturn true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/24452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux卸载残留MySQL【带图文命令巨详细】

Linux卸载残留MySQL 1、检查残留mysql2、检查并删除残留mysql依赖3、检查是否自带mariadb库 1、检查残留mysql 如果残留mysql组件&#xff0c;使用命令 rpm -e --nodeps 残留组件名 按顺序进行移除操作 #检查系统是否残留过mysql rpm -qa | grep mysql2、检查并删除残留mysql…

k8s——Pod容器中的存储方式及PV、PVC

一、Pod容器中的存储方式 需要存储方式前提&#xff1a;容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。 首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&…

TensorRT 精度debug分析工具

tensorRT还提供了一套可用于engine生成过程中debug的工具&#xff0c;包括Polygraphy、ONNX GraphSurgeon和PyTorch-Quantization。这些小工具用处很大&#xff0c;值得花时间进一步研究。 Debug方法示例 polygraphy Polygraphy是TensorRT官方提供的一系列小工具合集&#x…

spring源码解析-(1)关于Bean

什么是Bean&#xff1f; 是spring对所有注入到IoC容器中的类的统称。 我们要注册进入spirng的bean千奇百怪&#xff0c;所以spring必须需要使用一个统一的定义来标识bean&#xff0c;就有了接下来的BeandDefinition&#xff0c;通过名称我们就可以知道&#xff0c;他是对bean…

美国演员工会SAG-AFTRA 要求人工智能在广告中使用演员声音需征得同意并付费

SAG-AFTRA 的新豁免允许在人工智能生成的广告中使用演员的声音&#xff0c;但需要同意、补偿和安全措施 美国演员工会&#xff08;SAG-AFTRA&#xff09;推出了一项新的豁免&#xff0c;以保护会员免受未经授权的人工智能在广告中使用其声音的影响。动态人工智能音频广告豁免定…

C语言Kruskal算法求最小生成树

Kruskal算法求出最小生成树。 图形 算法描述 先找最小权值边为1的边有&#xff08;V1&#xff0c;V4&#xff09;&#xff0c;&#xff08;V2&#xff0c;V9&#xff09;&#xff0c;保证不产生回路就可以成功选择边 除去上一次找的边后&#xff0c;在找权值最小的边为2的有&a…

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中&#xff0c;企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力&#xff0c;成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人&#xff0c;并强调其功能体…

OpenAI发表研究论文 介绍了一种逆向工程AI模型工作原理的方法

ChatGPT 开发商 OpenAI 构建人工智能的方法本周遭到了前员工的抨击&#xff0c;他们指责该公司利用可能有害的技术冒不必要的风险。今天&#xff0c;OpenAI 发布了一篇新的研究论文&#xff0c;目的显然是为了表明它在通过提高模型的可解释性来应对人工智能风险方面的认真态度。…

hot100 -- 二分查找

目录 前言 &#x1f382;搜索插入位置 &#x1f33c;搜索二维矩阵 &#x1f33c;排序数组元素第一和最后一个位置 &#x1f33c;旋转排序数组 &#x1f4aa;旋转排序数组中的最小值 &#x1f4aa;两个正序数组的中位数 前言 二分算法学习_时间超限ac:0%-CSDN博客 &#…

2024年【起重机械指挥】考试及起重机械指挥新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机械指挥新版试题题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机械指挥试题及解析很简单。 1、【多选题】《中华人民共和国特…

【Androi】安卓发展历程详解

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

git推送代码到github拒绝推送的解决方案

这里描述一下本地推送的场景&#xff0c;首先我在码云上建立了一个前端项目&#xff0c;进行了自己的个性化开发&#xff0c;后期在github上创建了一个一样的项目仓库存放代码。使用webstorm进行代码开发。在下面这个位置可以选择推送的代码位置。 选择推送github仓库之后&…

Python深度学习基于Tensorflow(16)基于Tensorflow的对话实例

文章目录 基础数据清洗数据生成词汇表定义分词器并制作数据集构建Transformer模型并训练模型推理 Tensorflow 的核心就是注意力机制&#xff0c;在之前详细的介绍过&#xff0c;具体可以看这个&#xff1a;Python深度学习基于Tensorflow&#xff08;9&#xff09;注意力机制_te…

在Java中为什么对a赋值为10,在进行a++时还是等于10呢

首先我们看这样一组代码 public class demo1 {public static void main(String[] args) {int a10;aa;System.out.println(a);} } 结果&#xff1a;10不是在第二步有a操作吗&#xff1f;为什么还是10呢&#xff1f; a的执行步骤如下&#xff1a; 保存当前a的值&#xff08;即10…

websocket链接携带参数

前端创建链接时官方提供的构造函数 var aWebSocket new WebSocket(url, [protocols]); url&#xff1a;要连接的URL&#xff1b;这应该是WebSocket服务器将响应的URL。 protocols&#xff1a;可选&#xff1b;一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定…

智能语音电销机器人可以做哪些事情?ai语音机器人系统

智能语音电销机器人软件的出现&#xff0c;给很多企业都带来了福利&#xff0c;尤其是电销企业&#xff0c;不仅工作效率提升了&#xff0c;成本降低了&#xff0c;还能实现智能化管理客户的出现&#xff0c;给很多企业都带来了福利&#xff0c;尤其是电销企业&#xff0c;不仅…

python初学者笔记(八)——数字阶乘

#python初学者笔记&#xff08;8&#xff09;——数字阶乘 阶乘是基斯顿卡曼于 1808 年发明的运算符号,是数学术语,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积。 下面利用Python编写数字阶乘 ##1.方法一:利用函数的方法&#xff0c;求输入值的阶乘 #coding…

WebAPI 前端开发流程:深度解析与实践探索

WebAPI 前端开发流程&#xff1a;深度解析与实践探索 在前端开发的世界里&#xff0c;WebAPI扮演着至关重要的角色&#xff0c;它作为前端与后端沟通的桥梁&#xff0c;确保了数据的流畅传输与功能的完整实现。本文将详细探讨WebAPI前端开发流程&#xff0c;从四个方面、五个方…

什么情况下需要配戴助听器

以下几种情况需要考虑配戴助听器&#xff1a; 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等&#xff0c;均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制&#xff0c;从出生数周的婴…

深度学习Week16——数据增强

文章目录 深度学习Week16——数据增强 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 配置数据集 2.3 数据可视化 四、数据增强 五、增强方式 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、训练模型 七、自定义增强函数 一、前言…