当前位置: 首页 > news >正文

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

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

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

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 数据库来存储和查询数据:

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          |
+----+------------+

运行代码:

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 提高查询性能。

相关文章:

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

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…...

mysql 等保处理,设置wait_timeout引发的问题

&#x1f468;‍⚕ 主页&#xff1a; gis分享者 &#x1f468;‍⚕ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕ 收录于专栏&#xff1a;运维工程师 文章目录 前言问题处理 前言 系统部署完成后&#xff0c;客户需要做二级等保&…...

7.STM32F407ZGT6-RTC

参考&#xff1a; 1.正点原子 前言&#xff1a; RTC实时时钟是很基本的外设&#xff0c;用来记录绝对时间。做个总结&#xff0c;达到&#xff1a; 1.学习RTC的原理和概念。 2.通过STM32CubeMX快速配置RTC。 27.1 RTC 时钟简介 STM32F407 的实时时钟&#xff08;RTC&#xf…...

重写(补充)

大家好&#xff0c;今天我们把剩下一点重写内容说完&#xff0c;来看。 [重写的设计规则] 对于已经投入使用的类,尽量不要进行修政 &#xff0c;最好的方式是:重新定义一个新的类,来重复利用其中共性的内容 我们不该在原来的类上进行修改&#xff0c;因为原来的类,可能还有用…...

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <3>5分钟集成好druid并使用druid自带监控工具监控sql请求

快速导航 快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus g…...

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章&#xff0c;若需要转载&#xff0c;请注明出处。 原文地址&#xff1a;https://blog.csdn.net/qq_30270773/article…...

Oracle 分区索引简介

目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引&#xff08;Local Partitioned Index&#xff09;2.2 全局分区索引&#xff08;Global Partitioned Index&#xff09; 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...

【科技赋能未来】NDT2025第三届新能源数字科技大会全面启动!

随着我国碳达峰目标、碳中和目标的提出&#xff0c;以及经济社会的发展进步&#xff0c;以风电、光伏发电为代表的新能源行业迎来巨大发展机遇&#xff0c;成为未来绿色经济发展的主要趋势和方向。 此外&#xff0c;数字化技术的不断发展和创新&#xff0c;其在新能源领域的应…...

Broker收到消息之后如何存储

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》&#xff0c;我本人觉得这个作者还是不错&#xff0c;都是从场景来进行分析&#xff0c;感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…...

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)

一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器&#xff08;Query Optimizer&#xff09;是MySQL数据库管理系统中的一个关键组件&#xff0c;负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗&#xff…...

BERT与CNN结合实现糖尿病相关医学问题多分类模型

完整源码项目包获取→点击文章末尾名片&#xff01; 使用HuggingFace开发的Transformers库&#xff0c;使用BERT模型实现中文文本分类&#xff08;二分类或多分类&#xff09; 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…...

rabbitmqp安装延迟队列

在RabbitMQ中&#xff0c;延迟队列是一种特殊的队列类型。当消息被发送到此类队列后&#xff0c;不会立即投递给消费者&#xff0c;而是会等待预设的一段时间&#xff0c;待延迟期满后才进行投递。这种队列在多种场景下都极具价值&#xff0c;比如可用于处理需要在特定时间触发…...

深入探讨DICOM医学影像中的MPPS服务及其具体实现

深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中&#xff0c;DICOM&#xff08;数字影像和通信医学&#xff09;标准发挥着至关重要的作用。除了DICOM影像的存储和传输&#xff08;如影像存储SCP和影像传输SCP&#xff09;&#xff0c;…...

集合帖:区间问题

一、AcWing 803&#xff1a;区间合并 &#xff08;1&#xff09;题目来源&#xff1a;https://www.acwing.com/problem/content/805/ &#xff08;2&#xff09;算法代码&#xff1a;https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…...

C#,入门教程(27)——应用程序(Application)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application&#xff1f; 应用程序是编程的结果。一般把代码经过编译&#xff08;等&#xff09;过程&#…...

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…...

CSS 样式 box-sizing: border-box; 详细解读

box-sizing是 CSS 中的一个属性&#xff0c;用于控制元素的盒模型计算方式。border-box值表示元素的宽度和高度将包括内边距&#xff08;padding&#xff09;和边框&#xff08;border&#xff09;&#xff0c;而不仅仅是内容的宽度和高度。这意味着当你为元素设置宽度和高度时…...

FLASK创建下载

html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端&#xff1a;url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

漫话架构师|什么是系统架构设计师(开篇)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 关注犬余&#xff0c;共同进步 技术从此不孤单...

告别重复造轮子:用快马AI一键生成可配置的魔鬼面具UI组件库

作为一个经常需要处理各种UI组件的前端开发者&#xff0c;最近在做一个万圣节主题项目时&#xff0c;遇到了一个有趣的挑战&#xff1a;需要快速开发一套可配置的魔鬼面具组件库。传统手动编码方式不仅耗时&#xff0c;而且难以应对多风格需求。幸运的是&#xff0c;我发现了In…...

Linux文件搜索工具FSearch:从卡顿到闪电的搜索体验革新

Linux文件搜索工具FSearch&#xff1a;从卡顿到闪电的搜索体验革新 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 在Linux系统中&#xff0c;文件搜索往往是一场与时…...

PyTorch 2.8镜像真实效果:量子计算电路→量子态演化视频模拟

PyTorch 2.8镜像真实效果&#xff1a;量子计算电路→量子态演化视频模拟 1. 量子计算模拟效果展示 量子计算作为前沿计算领域&#xff0c;其可视化一直是教学和研究的难点。我们使用PyTorch 2.8镜像实现了从量子电路到量子态演化的完整视频模拟流程&#xff0c;以下是关键效果…...

微信公众号模板消息推送实战:从配置到代码实现(PHP版)

微信公众号模板消息推送实战&#xff1a;PHP开发全流程指南 在移动互联网时代&#xff0c;微信公众号已成为企业与用户沟通的重要桥梁。模板消息作为微信生态中的关键功能&#xff0c;能够实现精准、高效的信息触达。本文将带领PHP开发者从零开始&#xff0c;完整掌握模板消息推…...

Go语言实现SHA256加密的避坑指南:从常量初始化到循环优化

Go语言实现SHA256加密的避坑指南&#xff1a;从常量初始化到循环优化 在区块链、数字签名和密码保护等领域&#xff0c;SHA256算法因其高安全性被广泛应用。作为Go语言开发者&#xff0c;理解并正确实现SHA256加密不仅关乎功能实现&#xff0c;更直接影响系统性能和安全性。本文…...

Virtual-Display-Driver:Windows虚拟显示器的全能解决方案深度解析

Virtual-Display-Driver&#xff1a;Windows虚拟显示器的全能解决方案深度解析 【免费下载链接】Virtual-Display-Driver Add virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software. 项目地址: https://gitco…...

什么是哈希算法?(大白话+原理+应用,一次讲透)

文章目录一、一句话定义二、用生活例子秒懂对应到代码里&#xff1a;三、哈希算法的核心特性&#xff08;面试必背&#xff09;四、为什么 HashSet.contains() 是 O(1)&#xff1f;&#xff08;结合哈希原理&#xff09;五、哈希算法的常见应用&#xff08;你日常都在用&#x…...

从Flatten到Hierarchy:数字IC后端工程师必须掌握的时序收敛技巧

从Flatten到Hierarchy&#xff1a;数字IC后端工程师必须掌握的时序收敛技巧 在22nm以下工艺节点&#xff0c;单芯片晶体管数量已突破10亿大关。面对如此庞大的设计规模&#xff0c;传统扁平化&#xff08;Flatten&#xff09;流程如同试图用绣花针建造摩天大楼——理论上可行&a…...

ClaudeCode 入门详细教程,手把手带你Vibe Coding

本文使用 Mac 进行演示。主要是在安装环节有环境差异。 1. Claude Code 简介 Claude Code 是 Anthropic 推出的面向开发者的 AI 编程协作工具。Claude Code 的核心目标是理解你的整个项目&#xff0c;并参与到真实的编码、修改和重构过程中。Claude Code 不是一个代码生成器&…...

LongCat-Video:136亿参数开源AI视频生成模型的技术突破与实践指南

LongCat-Video&#xff1a;136亿参数开源AI视频生成模型的技术突破与实践指南 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 在人工智能视频生成领域&#xff0c;长视频生成一直是技术挑战的制高点。传统…...