LeetCode - #196 删除重复的电子邮件并保留最小 ID 的唯一电子邮件

embedded/2025/2/3 21:12:23/

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

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

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

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

文章目录

    • 摘要
    • 描述
    • 题解答案
      • Swift 解法:
    • 题解代码
    • 题解代码分析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结
    • 未来展望
    • 参考资料

摘要

在数据库操作中,去除重复数据是常见的任务之一。本篇文章将使用 Swift 语言模拟 SQL 操作,解决删除重复电子邮件并保留最小 id 的唯一电子邮件的问题。通过详细的代码分析和示例展示,帮助读者理解如何实现该功能。

描述

问题背景
给定一个 Person 表,表中包含 idemail 字段。每个电子邮件可以出现多次,任务是删除重复的电子邮件,仅保留 id 最小的那个。

输入: Person 表:

+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

输出:

+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

解释:

  • john@example.com 重复出现了两次,保留最小 id 的一条记录。

题解答案

要删除重复的电子邮件,并保留最小 id 的唯一电子邮件,首先可以利用字典或集合来查找重复的 email,然后基于 id 删除不必要的记录。

Swift 解法:

  1. 遍历表格数据:通过遍历 Person 表的所有记录,检查是否有重复的 email
  2. 删除重复记录:将重复的 email 对应记录的 id 大于最小值的项删除。

下面是基于 Swift 的实现:

题解代码

swift">import Foundationstruct Person {var id: Intvar email: String
}func removeDuplicateEmails(persons: inout [Person]) {var seenEmails: [String: Int] = [:]  // 用来存储每个电子邮件的最小 id// 遍历列表,找到每个电子邮件的最小 idfor person in persons {if let existingId = seenEmails[person.email] {// 如果该邮箱已存在且当前 id 较大,则删除if person.id < existingId {seenEmails[person.email] = person.id}} else {seenEmails[person.email] = person.id}}// 根据 seenEmails 过滤掉不需要的记录persons = persons.filter { seenEmails[$0.email] == $0.id }
}// 示例数据
var persons = [Person(id: 1, email: "john@example.com"),Person(id: 2, email: "bob@example.com"),Person(id: 3, email: "john@example.com")
]// 执行删除重复邮件
removeDuplicateEmails(persons: &persons)// 输出结果
for person in persons {print("\(person.id) \(person.email)")
}

题解代码分析

  1. 数据结构

    • 使用 seenEmails 字典存储每个 email 对应的最小 id
    • 如果遇到相同的 email,则比较 id,保留最小的 id
  2. 过滤重复记录

    • 遍历所有 Person 记录,通过 seenEmails 判断是否为该 email 的最小 id,过滤掉不符合条件的记录。
  3. 输出结果

    • 输出符合条件的记录,即保留最小 id 的唯一电子邮件。

示例测试及结果

输入数据:

swift">var persons = [Person(id: 1, email: "john@example.com"),Person(id: 2, email: "bob@example.com"),Person(id: 3, email: "john@example.com")
]

输出结果:

1 john@example.com
2 bob@example.com

时间复杂度

  1. 遍历数据

    • 对于每个 Person,检查并更新 seenEmails 的操作是 O(1),因此遍历所有记录的时间复杂度是 O(n),其中 n 是记录数。
  2. 过滤记录

    • 使用 filter 操作过滤掉重复记录,时间复杂度是 O(n)
  3. 总时间复杂度

    • 总的时间复杂度是 O(n)

空间复杂度

  1. 存储数据

    • seenEmails 字典存储每个 email 的最小 id,因此空间复杂度为 O(m),其中 m 是不同的 email 数量。
  2. 输出数据

    • 存储符合条件的 Person 数组空间复杂度为 O(n)
  3. 总空间复杂度

    • 总的空间复杂度是 O(n + m)

总结

  1. Swift 的实现:通过字典存储电子邮件的最小 id,高效去除重复邮件并保留最小 id 的记录。
  2. 适用场景:适用于需要去重并保留唯一记录的场景,例如用户数据库的去重操作。
  3. 时间与空间效率:时间复杂度为 O(n),空间复杂度为 O(n + m),对于较大的数据集也能高效处理。

未来展望

  1. 可以扩展为支持更多字段的去重操作。
  2. 对于非常大的数据集,可以采用分布式存储和处理机制进行优化。
  3. 提供更多的过滤条件,例如按其他字段去重。

参考资料

  • Swift 官方文档
  • LeetCode 题解

http://www.ppmy.cn/embedded/159271.html

相关文章

【C++篇】哈希表

目录 一&#xff0c;哈希概念 1.1&#xff0c;直接定址法 1.2&#xff0c;哈希冲突 1.3&#xff0c;负载因子 二&#xff0c;哈希函数 2.1&#xff0c;除法散列法 /除留余数法 2.2&#xff0c;乘法散列法 2.3&#xff0c;全域散列法 三&#xff0c;处理哈希冲突 3.1&…

VSCode插件HTML CSS Support

1、打开VSCode软件&#xff0c;找到应用商城&#xff0c;搜索并安装插件“HTML CSS Support”。 2、“HTML CSS Support”插件提供代码片段快速插入功能&#xff1a;如输入 div.main 后按enter键会自动生成一个带有 class 为 main 的 div 标签。 3、“HTML CSS Support”插件…

使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

1. 导入必要的库 首先&#xff0c;导入我们需要的库&#xff1a;Numpy、Pytorch 和相关工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定义数据集 …

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…

【Linux】23.进程间通信(2)

文章目录 3. 进程间通信3.1 进程间通信介绍3.1.1 进程间通信目的3.1.2 进程间通信发展 3.2 什么是进程间通信3.3 管道3.4 匿名管道3.4.1 站在文件描述符角度-深度理解管道3.4.2 站在内核角度-管道本质3.4.3 用fork来共享管道原理3.4.5 管道相关知识3.4.6 代码一3.4.7 代码二 验…

如何利用AI工具来进行数据分析

利用AI工具进行数据分析可以显著提高效率和准确性&#xff0c;以下是详细步骤和方法&#xff1a; 1. 明确分析目标 在开始数据分析之前&#xff0c;首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果&#xff0c;以及选择合适的AI工具和方法。 2. …

为AI聊天工具添加一个知识系统 之71 详细设计 之12 形式文法、范式语法和惯式用法

本文要点 当前任务是本项目的形式文法。在已知的Type-0~Ⅲ的基础上增加Type-Ⅳ型并将不同文法型和维度挂钩&#xff0c;分别表示文法的不同的 符号元组&#xff1a; S&#xff08;start symbol&#xff09; &#xff1a;高内聚的 Type-0型&#xff08; 动态链接库 linked--…

TCP UDP Service Model

主机A的TCP层可以通过发送FIN消息来关闭链接&#xff0c;主机B确认A不再有数据发送&#xff0c;并停止从A接收新数据。 B完成向A发送数据&#xff0c;并发送自己的FIN消息&#xff0c;告知A它们可以关闭链接。 主机A通过发送ACK作为回应&#xff0c;确认链接现已关闭。 &…