LeetCode - #182 Swift 实现找出重复的电子邮件


大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者
文章目录
- 摘要
- 描述
- 问题背景
- 输入输出示例
- SQL 解法
- Swift 题解代码
- Swift 题解代码分析
- SQL 查询逻辑
- Swift 实现分析
- 示例测试及结果
- 测试 1
- 时间复杂度
- SQL 查询
- 空间复杂度
- 总结
摘要
在现代数据库系统中,管理电子邮件数据的完整性和准确性非常重要。本文以 SQL 和 Swift 的结合为例,演示如何有效地找到数据库中重复的电子邮件记录。我们将提供完整的代码示例和详细的实现分析,助力开发者快速上手解决类似问题。

描述
问题背景
我们需要从表 Person 中找出所有重复的电子邮件。电子邮件列不为空,且保证全部为小写。返回的结果只包含重复的电子邮件,按任意顺序输出。
输入输出示例
输入:
Person 表:
+----+---------+
| id | email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
输出:
+---------+
| Email |
+---------+
| a@b.com |
+---------+
解释: a@b.com 出现了两次,因此被列为重复的电子邮件。

SQL 解法
我们可以通过分组查询找到重复的电子邮件,并筛选出出现次数大于 1 的记录。
SQL 查询如下:
SELECT email AS Email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1;
说明:
- 分组统计:
- 使用
GROUP BY按email分组。 - 每组统计该
email的出现次数。
- 使用
- 筛选条件:
- 使用
HAVING COUNT(email) > 1过滤出重复的电子邮件。
- 使用
Swift 题解代码
以下是基于 Swift 的完整实现,使用 SQLite 数据库来存储和查询数据:
import SQLite3func findDuplicateEmails(databasePath: String) -> [String] {var db: OpaquePointer?var stmt: OpaquePointer?var results: [String] = []// 打开数据库连接if sqlite3_open(databasePath, &db) == SQLITE_OK {let query = """SELECT email AS EmailFROM PersonGROUP BY emailHAVING COUNT(email) > 1;"""// 准备 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 email = String(cString: cString)results.append(email)}}} 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 duplicateEmails = findDuplicateEmails(databasePath: databasePath)
print("Duplicate Emails: \(duplicateEmails)")
Swift 题解代码分析
SQL 查询逻辑
-
GROUP BY操作:- 将
email列按值分组,统计每个email的数量。
- 将
-
HAVING条件:- 使用聚合函数
COUNT(email)筛选出出现次数大于 1 的email。
- 使用聚合函数
-
结果返回:
- 使用
SELECT email返回符合条件的电子邮件。
- 使用
Swift 实现分析
-
数据库连接:
- 使用
sqlite3_open连接 SQLite 数据库。
- 使用
-
查询执行:
- 调用
sqlite3_prepare_v2准备 SQL 查询。 - 使用
sqlite3_step遍历查询结果,并将每行的email提取到数组results中。
- 调用
-
结果输出:
- 返回重复电子邮件的数组。
示例测试及结果
测试 1
数据库内容:
+----+---------+
| id | email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
运行代码:
let duplicateEmails = findDuplicateEmails(databasePath: databasePath)
print("Duplicate Emails: \(duplicateEmails)")
输出结果:
Duplicate Emails: ["a@b.com"]
时间复杂度
SQL 查询
- 分组操作:
- 时间复杂度为 (O(n \log n)),其中 (n) 是
Person表的记录数。
- 时间复杂度为 (O(n \log n)),其中 (n) 是
- 过滤条件:
- 遍历每个分组的复杂度为 (O(k)),其中 (k) 是分组数。
总时间复杂度: (O(n \log n))。
空间复杂度
- 查询结果存储:
- 需要存储重复的电子邮件,空间复杂度为 (O(k)),其中 (k) 是重复电子邮件的数量。
总空间复杂度: (O(k))。
总结
本文提供了一个完整的解决方案,用于找出数据库中重复的电子邮件。通过 SQL 的分组与聚合操作,结合 Swift 的数据库接口实现,我们能够快速、高效地完成任务。此方法不仅适用于电子邮件,还可扩展至其他重复数据的查询需求。在实践中,配合索引优化可以进一步提升性能。
相关文章:
LeetCode - #182 Swift 实现找出重复的电子邮件
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》
在当今数字化时代,鸿蒙Next系统与人工智能的融合为开发者带来了前所未有的机遇,开发一款人工智能语音助手应用更是备受关注。以下是在鸿蒙Next系统上开发人工智能语音助手应用的关键步骤: 环境搭建与权限申请 安装开发工具:首先需…...
【Linux网络编程】数据链路层 | MAC帧 | ARP协议
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系…...
《自动驾驶与机器人中的SLAM技术》ch7:基于 ESKF 的松耦合 LIO 系统
目录 基于 ESKF 的松耦合 LIO 系统 1 坐标系说明 2 松耦合 LIO 系统的运动和观测方程 3 松耦合 LIO 系统的数据准备 3.1 CloudConvert 类 3.2 MessageSync 类 4 松耦合 LIO 系统的主要流程 4.1 IMU 静止初始化 4.2 ESKF 之 运动过程——使用 IMU 预测 4.3 使用 IMU 预测位姿进…...
基于spingbott+html+Thymeleaf的24小时智能服务器监控平台设计与实现
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…...
全栈面试(一)Basic/微服务
文章目录 项目地址一、Basic InterviewQuestions1. tell me about yourself?2. tell me about a time when you had to solve a complex code problem?3. tell me a situation that you persuade someone at work?4. tell me a about a confict with a teammate and how you…...
python安装完成后可以进行的后续步骤和注意事项
安装Python3完成后,你可以开始使用它进行编程和开发。以下是一些安装完成后可以进行的后续步骤和注意事项: 验证安装 检查Python版本: 打开“终端”应用程序。输入python3 --version,应该显示安装的Python3版本号。 检查pip版本…...
[Qt] 窗口 | 菜单栏MenuBar
目录 QMainWindow 概述 一、菜单栏 1、创建菜单栏 2、在菜单栏中添加菜单 3、创建菜单项 4、在菜单项之间添加分割线 5、添加快捷键 6、添加子菜单 7、添加图标 综合示例 QMainWindow 概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户 提供主…...
[读书日志]从零开始学习Chisel 第十三篇:Scala的隐式参数与隐式转换(敏捷硬件开发语言Chisel与数字系统设计)
10. 隐式转换与隐式参数 假设编写了一个向量类MyVector,并且包含一些向量的基本操作。因为向量可以与标量做数乘运算,所以需要一个计算数乘的方法“*”,它应该接收一个类型为基本值类的参数,在向量对象myVec调用该方法时…...
CMake学习笔记(1)
1. CMake概述 CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt …...
cursor+deepseek构建自己的AI编程助手
文章目录 准备工作在Cursor中添加deepseek 准备工作 下载安装Cursor (默认安装在C盘) 注册deepseek获取API key 在Cursor中添加deepseek 1、打开cursor,选择设置 选择Model,添加deepseek-chat 注意这里去掉其他的勾选项&…...
Kotlin实现DataBinding结合ViewModel的时候,提示找不到Unresolved reference: BR解决方案
在用Kotlin语言实现DataBinding结合ViewModel的代码的时候,如下所示: class UserModel(private val userName: String, private val userAge: Int) : BaseObservable() {get:Bindablevar name: String userNameset (value) {field valuenotifyPropert…...
java项目启动时,执行某方法
1. J2EE项目 在Servlet类中重写init()方法,这个方法会在Servlet实例化时调用,即项目启动时调用。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;public class MyServlet extends HttpServlet {Overridepublic void …...
详解如何自定义 Android Dex VMP 保护壳
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 前言 Android Dex VMP(Virtual Machine Protection,虚拟机保护)壳是一种常见的应用保护技术,主要用于保护 And…...
Grails应用http.server.requests指标数据采集问题排查及解决
问题 遇到的问题:同一个应用,Spring Boot(Java)和Grails(Groovy)混合编程,常规的Spring Controller,可通过Micromete Pushgateway, 采集到http.server.requests指标数据,注意下面的指标名称是点号&#…...
开源临床试验软件OpenClinica的安装
本文是为帮网友 A萤火虫 解决安装问题做的记录; 简介 什么是 OpenClinica ? OpenClinica 是世界上第一个商业开源临床试验软件,主要用于电子数据捕获(EDC)和临床数据管理(CDM)。它的设计旨在优…...
网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法
网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》(GDPR)2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》(CCPA)3.1 背景3.2 主要内…...
深入学习 Python 爬虫:从基础到实战
深入学习 Python 爬虫:从基础到实战 前言 Python 爬虫是一个强大的工具,可以帮助你从互联网上抓取各种数据。无论你是数据分析师、机器学习工程师,还是对网络数据感兴趣的开发者,爬虫都是一个非常实用的技能。在本文中ÿ…...
element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮
最近在重构项目,使用了 element plus UI框架,有个功能是实现图片上传,且限制只能上传一张图片,结果,发现,可以限制只上传一张图片,但是上传按钮还在,如图: 解决办法&…...
音频DSP的发展历史
音频数字信号处理(DSP)的发展历史是电子技术、计算机科学和音频工程共同进步的结果。这个领域的进展不仅改变了音乐制作、音频后期制作和通信的方式,也影响了音频设备的设计和功能。以下是对音频DSP发展历史的概述: 早期概念和理论…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
