LeetCode - #183 Swift 实现查询未下订单的客户

news/2025/1/17 21:53:30/

在这里插入图片描述
在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者

文章目录

    • 摘要
    • 描述
      • 问题背景
      • 输入输出示例
    • SQL 解法
    • Swift 题解代码
    • Swift 题解代码分析
      • SQL 查询逻辑
      • Swift 实现分析
    • 示例测试及结果
      • 测试 1
    • 时间复杂度
      • SQL 查询
    • 空间复杂度
    • 总结

摘要

在数据处理中,经常需要从关联表中筛选出符合条件的数据。本篇文章以“找出从未下订单的客户”为例,结合 SQL 查询和 Swift 编程,提供完整的解决方案。文章内容包括题解答案、代码分析、示例测试及结果展示,帮助开发者快速掌握此类问题的解决思路。

描述

问题背景

我们有两张表:

  1. Customers 表: 包含客户的 ID 和姓名。
  2. Orders 表: 包含订单的 ID 和关联的客户 ID。

任务是找出所有从未下过订单的客户,即那些在 Orders 表中没有任何记录的客户。

输入输出示例

输入:

Customers 表:

+----+-------+
| id | name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+

Orders 表:

+----+------------+
| id | customerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+

输出:

+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

解释: HenryMaxidOrders 表中不存在,因此他们是未下订单的客户。

SQL 解法

可以使用 LEFT JOINWHERE 条件来查找未下订单的客户。

SQL 查询如下:

SELECT C.name AS Customers
FROM Customers C
LEFT JOIN Orders O ON C.id = O.customerId
WHERE O.customerId IS NULL;

Swift 题解代码

以下是基于 Swift 的完整实现,使用 SQLite 数据库来存储和查询数据:

swift">import SQLite3func findCustomersWithoutOrders(databasePath: String) -> [String] {var db: OpaquePointer?var stmt: OpaquePointer?var results: [String] = []// 打开数据库连接if sqlite3_open(databasePath, &db) == SQLITE_OK {let query = """SELECT C.name AS CustomersFROM Customers CLEFT JOIN Orders O ON C.id = O.customerIdWHERE O.customerId IS NULL;"""// 准备 SQL 查询if sqlite3_prepare_v2(db, query, -1, &stmt, nil) == SQLITE_OK {// 执行查询并获取结果while sqlite3_step(stmt) == SQLITE_ROW {if let cString = sqlite3_column_text(stmt, 0) {let customerName = String(cString: cString)results.append(customerName)}}} else {print("SQL Error: \(String(cString: sqlite3_errmsg(db)))")}// 清理资源sqlite3_finalize(stmt)}sqlite3_close(db)return results
}// 示例测试
let databasePath = "path_to_your_database.sqlite"
let customersWithoutOrders = findCustomersWithoutOrders(databasePath: databasePath)
print("Customers without orders: \(customersWithoutOrders)")

Swift 题解代码分析

SQL 查询逻辑

  1. LEFT JOIN 操作:

    • Customers 表和 Orders 表通过 idcustomerId 进行左连接。
    • 对每个客户,若没有匹配的订单记录,则 O.customerIdNULL
  2. WHERE 条件:

    • 筛选出 O.customerId IS NULL 的记录,即未下订单的客户。
  3. 结果返回:

    • 只返回符合条件客户的姓名。

Swift 实现分析

  1. 数据库连接:

    • 使用 sqlite3_open 连接 SQLite 数据库。
  2. 查询执行:

    • 使用 sqlite3_prepare_v2 准备 SQL 查询。
    • 遍历结果集,将每个未下订单客户的姓名添加到数组中。
  3. 结果输出:

    • 返回未下订单客户的姓名数组。

示例测试及结果

测试 1

数据库内容:
Customers 表:

+----+-------+
| id | name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+

Orders 表:

+----+------------+
| id | customerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+

运行代码:

swift">let customersWithoutOrders = findCustomersWithoutOrders(databasePath: databasePath)
print("Customers without orders: \(customersWithoutOrders)")

输出结果:

Customers without orders: ["Henry", "Max"]

时间复杂度

SQL 查询

  1. 连接操作:
    • 时间复杂度为 (O(n \cdot m)),其中 (n) 是 Customers 表的记录数,(m) 是 Orders 表的记录数。
  2. 过滤条件:
    • 遍历每个记录的复杂度为 (O(n))。

总时间复杂度: (O(n \cdot m))。

空间复杂度

  1. 查询结果存储:
    • 空间复杂度为 (O(k)),其中 (k) 是未下订单客户的数量。

总空间复杂度: (O(k))。

总结

通过 SQL 和 Swift 的结合,我们成功实现了查询未下订单客户的功能。本文提供了完整的代码、详细的分析和测试结果,适合开发者学习和借鉴。此方法具有通用性,可扩展到其他类似的关联查询需求。在实践中,可以通过索引优化 Orders 表的连接键 customerId 提高查询性能。


http://www.ppmy.cn/news/1563985.html

相关文章

mongDB学习笔记

简介 MongoDB数据库是使用c语言编写而成分布式文件存储开源数据库。也是市面上常见的非关系型数据库。 MongoDB的数据结构是键值对(key–value)MongoDB数据结构类似于JSON对象,因此它的数据结构被叫做BSON(Binary JSON&#xff0…

机器视觉4-损失函数与梯度计算

机器视觉4-损失函数与梯度计算 损失函数定义公式及变量含义整体理解 多类支撑向量机损失正则项与超参数什么是超参数一、与模型参数的区别二、常见的超参数三、调参方法 什么是优化一、参数优化的重要性二、利用损失函数进行反馈三、调整分类器参数的方法 优化的目标一、最小化…

开疆智能Profient转DeviceNET主网关连接发那科机器人配置案例

此案例是由于客户在某车厂项目中,需要将甲方的发那科机器人介入到自己的Profinet网络系统中,由于机器人采用DeviceNET协议,故选择开疆智能研发的Profient转DeviceNET网关进行通讯转换。 首先下载EDS文件(或用第三方软件读取Device…

【全开源】跑腿小程序:智能派单、同城配送、校园跑腿及预约取件(用户端+骑手端)

【全开源】跑腿小程序/智能派单/系统派单/同城配送/校园跑腿/预约取件/用户端+骑手端 基于Fastadmin+ThinkPHP和Uniapp开发的优创同城跑腿系统,支持帮取、帮送模式,包含用户端、骑手端、运营后台。 支持一键接单/抢单, 为跑腿团队提供技术解决方案,无加密源码,可私有化部…

matlab展示龙格现象

为了展示龙格现象,它使用拉格朗日插值多项式,展示了随着插值点数目的增加,插值多项式在区间端点附近震荡的现象。 重新编写的 MATLAB 代码: % 定义目标函数 f (x) 1 ./ (1 x.^2);% 设置插值区间 x_interval [-5, 5]; % 插值…

ospf收敛特性及其他的小特性

1. 收敛特性 快速收敛:   只第一次计算时计算全部节点Full SPF   增量最短路径优先算法I-SPF(Incremental)    只对受影响的节点进行路由计算   全部路由计算PRC    只对发生变化的路由进行重新计算;    根据I-SPF 算出来的SPT …

8Hive SQL底层执行原理

8Hive SQL底层执行原理 1Hive 底层执行架构2Hive SQL 编译成 MapReduce 过程阶段一:词法、语法解析阶段二:语义解析阶段三:生成逻辑执行计划阶段四:优化逻辑执行计划阶段五:生成物理执行计划阶段六:优化物理…

国产编辑器EverEdit - 一个优秀的文本编辑器该有的删除功能

1 删除功能详解 1.1 概述 本文对EverEdit的删除功能进行介绍,用好这些小技巧,对办公效率会有较大的提高。 1.2 删除功能介绍 1.2.1 普通删除 1.2.1.1 前向删除 按退格键,删除光标前面的字符或选中的内容。 1.2.1.2 后向删除 按Del键&am…