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



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

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

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

文章目录

摘要

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

描述

问题背景 :

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

输入: Person 表:

txt 复制代码
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

输出:

txt 复制代码
+----+------------------+
| 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 Foundation

struct Person {
    var id: Int
    var email: String
}

func removeDuplicateEmails(persons: inout [Person]) {
    var seenEmails: [String: Int] = [:]  // 用来存储每个电子邮件的最小 id

    // 遍历列表,找到每个电子邮件的最小 id
    for 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")
]

输出结果:

txt 复制代码
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. 提供更多的过滤条件,例如按其他字段去重。

参考资料

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net