LeetCode 第 262 題全解析:從 SQL 到 Swift 的數據分析實戰

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
    • 題解答案(SQL)
    • Swift 題解代碼分析
    • 代碼示例(可運行 Demo)
    • 示例測試及結果
    • 時間復雜度分析
    • 空間復雜度分析
    • 總結
    • 未來展望

摘要

在實際業務中,打車平臺要監控行程的取消率,及時識別服務質量的問題。這篇文章圍繞 LeetCode 第 262 題,帶大家用 Swift 和 SQL 解題,并深入聊聊如何結合用戶數據和行程數據去計算每天的取消率,尤其是只計算“非禁止用戶”的數據。咱們還會補充一個可運行的 Swift Demo 來模擬分析過程,并講解這類題目在數據分析、風控和運營決策中的價值。

描述

這個題目其實就是想讓我們統計每天的“非被封禁用戶”的取消率。用戶數據在一張表里,行程數據在另一張表里。我們要結合這兩張表篩選出符合條件的數據:

  • 時間在 2013-10-01 到 2013-10-03 之間

  • 用戶不能是被禁用的(banned = No

  • 最終結果要按照天維度輸出,每天的取消率保留兩位小數

而且要注意,只有司機和乘客都不是禁止用戶的行程才參與計算。

題解答案(SQL)

雖然你要的是 Swift 題解,但這道題核心在于 SQL 聯表計算,我們先看 SQL 部分:

SELECT request_at AS Day,ROUND(SUM(CASE WHEN status IN ('cancelled_by_driver', 'cancelled_by_client') THEN 1ELSE 0END) * 1.0 / COUNT(*), 2) AS "Cancellation Rate"
FROM Trips t
JOIN Users c ON t.client_id = c.users_id AND c.banned = 'No'
JOIN Users d ON t.driver_id = d.users_id AND d.banned = 'No'
WHERE request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY request_at;

Swift 題解代碼分析

我們用 Swift 來模擬整個 SQL 的流程。假設我們有兩個 JSON 數據源,分別對應 Trips 表和 Users 表,我們會:

  1. 解析數據結構

  2. 過濾掉被封禁的用戶

  3. 篩選出符合時間條件的行程

  4. 分天統計總行程數和取消的行程數

  5. 最終計算每天的取消率并打印結果

代碼示例(可運行 Demo)

import Foundationstruct Trip {let id: Intlet clientId: Intlet driverId: Intlet status: Stringlet requestAt: String
}struct User {let userId: Intlet banned: Stringlet role: String
}let users: [User] = [.init(userId: 1, banned: "No", role: "client"),.init(userId: 2, banned: "Yes", role: "client"),.init(userId: 3, banned: "No", role: "client"),.init(userId: 4, banned: "No", role: "client"),.init(userId: 10, banned: "No", role: "driver"),.init(userId: 11, banned: "No", role: "driver"),.init(userId: 12, banned: "No", role: "driver"),.init(userId: 13, banned: "No", role: "driver")
]let trips: [Trip] = [.init(id: 1, clientId: 1, driverId: 10, status: "completed", requestAt: "2013-10-01"),.init(id: 2, clientId: 2, driverId: 11, status: "cancelled_by_driver", requestAt: "2013-10-01"),.init(id: 3, clientId: 3, driverId: 12, status: "completed", requestAt: "2013-10-01"),.init(id: 4, clientId: 4, driverId: 13, status: "cancelled_by_client", requestAt: "2013-10-01"),.init(id: 5, clientId: 1, driverId: 10, status: "completed", requestAt: "2013-10-02"),.init(id: 6, clientId: 2, driverId: 11, status: "completed", requestAt: "2013-10-02"),.init(id: 7, clientId: 3, driverId: 12, status: "completed", requestAt: "2013-10-02"),.init(id: 8, clientId: 2, driverId: 12, status: "completed", requestAt: "2013-10-03"),.init(id: 9, clientId: 3, driverId: 10, status: "completed", requestAt: "2013-10-03"),.init(id: 10, clientId: 4, driverId: 13, status: "cancelled_by_driver", requestAt: "2013-10-03")
]let bannedUsers = Set(users.filter { $0.banned == "Yes" }.map { $0.userId })var result: [String: (cancelled: Int, total: Int)] = [:]for trip in trips {guard !bannedUsers.contains(trip.clientId),!bannedUsers.contains(trip.driverId),["2013-10-01", "2013-10-02", "2013-10-03"].contains(trip.requestAt)else { continue }let date = trip.requestAtvar entry = result[date] ?? (0, 0)if trip.status == "cancelled_by_driver" || trip.status == "cancelled_by_client" {entry.cancelled += 1}entry.total += 1result[date] = entry
}for (day, entry) in result {let rate = entry.total == 0 ? 0.0 : Double(entry.cancelled) / Double(entry.total)print("\(day): \(String(format: "%.2f", rate))")
}

示例測試及結果

運行上述 Swift 程序,將會輸出:

2013-10-01: 0.33
2013-10-02: 0.00
2013-10-03: 0.50

這與題目給出的標準結果一致。

時間復雜度分析

假設行程數為 n,用戶數為 m

  • 篩選禁止用戶集合:O(m)

  • 遍歷 trips 數據:O(n)

  • 最終輸出:O(k),其中 k 是天數,這里固定為 3 天

總體時間復雜度是:O(n + m)

空間復雜度分析

  • 存儲禁止用戶集合:O(m)

  • 結果字典 result:最多三天,常量空間

所以總空間復雜度是:O(m)

總結

這題表面是 SQL 題,其實是在考察我們對數據的過濾和聚合能力。無論是用 SQL 寫聯表查詢,還是用 Swift 做數據模擬,都離不開一個核心思想——干凈準確的數據處理。

這個例子在實際項目中特別常見,比如:

  • 運營要知道每天的取消率趨勢

  • 數據平臺需要過濾掉異常數據(比如封禁用戶)

  • 數據分析師希望看到更精準的業務 KPI

未來展望

這類數據處理可以推廣到更多場景,比如:

  • 留存率、點擊率、完成率的計算

  • 實時監控系統中的數據聚合

  • 用戶行為數據的質量控制

未來我們可以拓展這個 Demo,接入真實數據庫或 API 數據源,構建一個完整的監控看板。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77912.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三生原理與現有密碼學的核心區別?

AI輔助創作: 三生原理與現有密碼學的核心區別 一、?哲學基礎與設計邏輯? ?動態生成 vs 靜態分析? 三生原理以“陰陽動態平衡”為核心,通過參數化生成(如素數構造中的陰陽元聯動公式)模擬系統演化過程,而現有密碼…

4.19-4.20學習總結 網絡編程+反射+動態代理

網絡編程: IPv6有2的128次方個ip。 端口號: 協議: UDP發送和接收消息: UDP的三種通信方式: 單播:一對一,一個發送端對應一個接收端 創建DatagramSocket對象 組播:一個發送端對應一…

Swiper、樣式結構重用、GridGridItem

今日核心: 容器組件:Swiper、Grid\GridItem樣式&結構重用:Builder、Extend、Styles 相關資源: 圖片素材:📎day01.zip 1. Swiper 1.1. 適用場景 首先來看看 Swiper 在什么情況下會用到 鏈接 Swiper組件提供滑…

前沿分享|技術雷達202504月刊精華

本期雷達 ###技術部分 7. GraphRAG 試驗 在上次關于 檢索增強生成(RAG)的更新中,我們已經介紹了GraphRAG。它最初在微軟的文章中被描述為一個兩步的流程: (1)對文檔進行分塊,并使用基于大語言…

數據結構與算法-順序表應用

一.通訊錄的創建 首先我們要理解的是通訊錄本身就是以順序表為底層的 只不過順序表中的數組,這里我們是用結構體來替代,用來存儲用戶的信息 由于是通訊錄的本質就是順序表,所以順序表的任何方法它都能套用 Contact.h: #pragma once #def…

【C++】新手入門指南(下)

文章目錄 前言 一、引用 1.引用的概念和定義 2.引用的特性 3.引用的使用 4.const引用 5.指針和引用的關系 二、內聯函數 三、nullptr 總結 前言 這篇續上篇的內容新手入門指南(上),繼續帶大家學習新知識。如果你感興趣歡迎訂購本專欄。 一、…

uniapp-商城-33-shop 布局搜索頁面以及u-search

shop頁面上有一個搜索&#xff0c;可以進行商品搜索&#xff0c;這里我們先做一個頁面布局&#xff0c;后面再來進行數據i聯動。 1、shop頁面的搜索 2、搜索的頁面代碼 <navigator class"searchView" url"/pagesub/pageshop/search/search"> …

SAP 采購訂單如何防止開票數量 大于 收貨數量呢

配置點如下&#xff1a; 事務碼&#xff1a;OMRM&#xff0c;配置如下 當過賬開票的數量 大于收貨數量的時候會提示如下&#xff1a;

Kotlin 的 suspend 關鍵字

更多相關知識 Kotlin 的 suspend 關鍵字是 Kotlin 協程的核心組成部分&#xff0c;它用于標記一個函數可以被掛起&#xff08;暫停執行&#xff09;并在稍后恢復執行&#xff0c;而不會阻塞線程。 理解 suspend 的作用需要從以下幾個方面入手&#xff1a; 1. 允許非阻塞的異步…

UDS診斷協議iso-14229 15765

Diagnostic request 形式多種: 1.SID+DID 2.SID+Sub-Func+DID 3.SID+Sub-Func SID占1個Byte,Sub-func占一個Byte,DID通常兩個Byte eg.10 01 (SID+Sub-Func) 10 03 05 02 (SID+Sub-Func+DID) 22 02 00 (SID+DID) 肯定響應抑制位 抑制正響應信息除非是收到NRC 0x78的情況下 不…

記錄一次使用面向對象的C語言封裝步進電機驅動

簡介 (2025/4/21) 本庫對目前僅針對TB6600驅動下的42步進電機的基礎功能進行了一定的封裝, 也是我初次嘗試以面向對象的思想去編寫嵌入式代碼, 和直流電機的驅動步驟相似在調用stepmotor_attach()函數和stepmotor_init()函數之后僅通過結構體數組stepm然后指定枚舉變量中的id即…

[創業之路-376]:企業法務 - 創業,不同的企業形態,個人承擔的風險、收益、稅費、成本不同

在企業法務領域&#xff0c;創業時選擇不同的企業形態&#xff0c;個人在風險承擔、收益分配、稅費負擔及運營成本方面存在顯著差異。以下從個人獨資企業、合伙企業、有限責任公司、股份有限公司四種常見形態展開分析&#xff1a; 一、個人承擔的風險 個人獨資企業 風險類型&…

GNOME桌面隱藏回收站和分區

dconf-editor 搜索 trash&#xff0c;關閉 show-trash 搜索 volumes&#xff0c;關閉 show-volumns

準確--Tomcat更換證書

具體意思是&#xff1a; Starting Coyote HTTP/1.1 on http-8080: HTTP 連接器&#xff08;端口 8080&#xff09;啟動成功了。嚴重: Failed to load keystore type PKCS12 with path conf/jlksearch.fzsmk.cn.pfx due to failed to decrypt safe contents entry: javax.crypt…

禁止ubuntu自動更新

由于ubuntu server和desktop版本都默認 啟動了&#xff0c;自動更新內核的操作。這對于生 產環境來說是不友好的。容易導致億賽通 無法啟動 默認開啟了內核自動更新所以我們關閉自 動內核更新。 1.禁止更新執行 sudo apt-mark hold linux-image-generic linux-headers-generic…

vue3 + element-plus中el-drawer抽屜滾動條回到頂部

el-drawer抽屜滾動條回到頂部 <script setup lang"ts" name"PerformanceLogQuery"> import { ref, nextTick } from "vue"; ...... // 詳情 import { performanceLogQueryByIdService } from "/api/performanceLog"; const onD…

【重走C++學習之路】16、AVL樹

目錄 一、概念 二、AVL樹的模擬實現 2.1 AVL樹節點定義 2.2 AVL樹的基本結構 2.3 AVL樹的插入 1. 插入步驟 2. 調節平衡因子 3. 旋轉處理 4. 開始插入 2.4 AVL樹的查找 2.5 AVL樹的刪除 1. 刪除步驟 2. 調節平衡因子 3. 旋轉處理 4. 開始刪除 結語 一、概念 …

char32_t、char16_t、wchar_t 用于 c++ 語言里存儲 unicode 編碼的字符,給出它們的具體定義

&#xff08;1&#xff09; #include <iostream> #include <string>int main() { std::u16string s u"C11 引入 char16_t"; // 定義 UTF-16 字符串for (char16_t c : s) // 遍歷輸出每個 char16_t 的值std::cout << std::hex << (…

redis數據類型-基數統計HyperLogLog

redis數據類型-基數統計HyperLogLog 文檔 redis單機安裝redis常用的五種數據類型redis數據類型-位圖bitmap 說明 官網操作命令指南頁面&#xff1a;https://redis.io/docs/latest/commands/?nameget&groupstringHyperLogLog介紹頁面&#xff1a;https://redis.io/docs…

邏輯思維:從混沌到秩序的理性推演在軟件開發中的應用

引言 在軟件開發的過程中&#xff0c;邏輯思維就像是開發者的“GPS導航”&#xff0c;幫助我們從混沌的需求中找到清晰的解決方案。想象一下&#xff0c;如果沒有邏輯思維&#xff0c;我們可能會在需求的海洋中迷失方向&#xff0c;最終寫出一堆“看似聰明但毫無意義”的代碼。…