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.pswp.cn/web/24452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24452.shtml
英文地址,請注明出處:http://en.pswp.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數據集中進行數據增強 六、訓練模型 七、自定義增強函數 一、前言…