首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode - #181 Swift 实现找出收入比经理高的员工

LeetCode - #181 Swift 实现找出收入比经理高的员工

原创
作者头像
Swift社区
发布2025-04-02 22:25:09
发布2025-04-02 22:25:09
2410
举报
文章被收录于专栏:Swift社区Swift社区

摘要

在企业管理中,员工工资信息是非常重要的分析数据。本文将基于一个Employee表,通过 SQL 查询找到收入比其经理高的员工。我们提供了 Swift 的完整实现代码,并详细分析了解决方案,测试其正确性及效率。

描述

问题背景

给定一张员工表 Employee,每行包括员工 ID、姓名、工资以及其经理的 ID。我们需要找出那些工资高于直接经理的员工。

输入输出示例

输入:

Employee 表:

代码语言:txt
复制
+----+-------+--------+-----------+
| id | name  | salary | managerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | Null      |
| 4  | Max   | 90000  | Null      |
+----+-------+--------+-----------+

输出:

代码语言:txt
复制
+----------+
| Employee |
+----------+
| Joe      |
+----------+

解释: Joe 的经理 Sam 的工资是 60000,而 Joe 的工资是 70000,比经理高。

SQL 解法

我们需要通过自连接来将员工表中的数据匹配到其经理对应的工资,从而找到符合条件的员工。

SQL 查询如下:

代码语言:sql
复制
SELECT e1.name AS Employee
FROM Employee e1
JOIN Employee e2
ON e1.managerId = e2.id
WHERE e1.salary > e2.salary;

说明:

  1. Employee 表自连接,匹配员工和其经理的信息:
    • e1.managerId = e2.id:将员工的 managerId 与经理的 id 关联起来。
  2. 使用 WHERE 条件过滤出工资高于经理的员工:e1.salary > e2.salary

Swift 题解代码

以下是基于 Swift 的实现代码,使用 SQLite 数据库进行操作:

代码语言:swift
复制
import SQLite3

func findEmployeesWithHigherSalaryThanManager(databasePath: String) -> [String] {
    var db: OpaquePointer?
    var stmt: OpaquePointer?
    var results: [String] = []

    // 打开数据库连接
    if sqlite3_open(databasePath, &db) == SQLITE_OK {
        let query = """
        SELECT e1.name AS Employee
        FROM Employee e1
        JOIN Employee e2
        ON e1.managerId = e2.id
        WHERE e1.salary > e2.salary;
        """
        
        // 准备查询语句
        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 name = String(cString: cString)
                    results.append(name)
                }
            }
        } 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 employees = findEmployeesWithHigherSalaryThanManager(databasePath: databasePath)
print("Employees with higher salary than manager: \(employees)")

Swift 题解代码分析

SQL 查询解析

  1. 表自连接:
    • 将表中的每个员工记录 e1 与可能是其经理的记录 e2 配对。
    • 通过条件 e1.managerId = e2.id 实现员工与经理之间的匹配。
  2. 条件过滤:
    • 检查 e1.salary > e2.salary,即员工工资是否高于经理工资。
  3. 返回结果:
    • 使用 SELECT e1.name 只返回员工的姓名。

Swift 数据库操作

  • 使用 sqlite3 库与 SQLite 数据库交互。
  • 执行 SQL 查询并将结果存储到 Swift 数组中以供后续处理。

结果存储

查询结果存储在 results 数组中,类型为 [String]

示例测试及结果

测试 1

数据库内容:

代码语言:txt
复制
+----+-------+--------+-----------+
| id | name  | salary | managerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | Null      |
| 4  | Max   | 90000  | Null      |
+----+-------+--------+-----------+

运行代码:

代码语言:swift
复制
let employees = findEmployeesWithHigherSalaryThanManager(databasePath: databasePath)
print(employees)

结果输出:

代码语言:txt
复制
Employees with higher salary than manager: ["Joe"]

时间复杂度

SQL 查询

  1. 自连接: 遍历员工表两次,时间复杂度为 (O(n^2)),其中 (n) 为员工数目。
  2. 过滤条件: 对自连接结果逐条检查,复杂度为 (O(n))。

总时间复杂度: (O(n^2))

空间复杂度

  1. SQL 查询结果存储: 存储符合条件的员工姓名,空间复杂度为 (O(k)),其中 (k) 是符合条件的员工数。
  2. Swift 数组: 用于存储最终结果。

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

总结

通过本文,我们使用 SQL 查询结合 Swift 数据库操作,成功解决了“找出收入比经理高的员工”问题。本方案简单易行且适用于多种场景。未来可以通过优化数据库索引和查询逻辑进一步提升性能。


SQL Schema

Pandas Schema

表:Employee

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| id | int |

| name | varchar |

| salary | int |

| managerId | int |

+-------------+---------+

id 是该表的主键(具有唯一值的列)。

该表的每一行都表示雇员的ID、姓名、工资和经理的ID。

编写解决方案,找出收入比经理高的员工。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:

Employee 表:

+----+-------+--------+-----------+

| id | name | salary | managerId |

+----+-------+--------+-----------+

| 1 | Joe | 70000 | 3 |

| 2 | Henry | 80000 | 4 |

| 3 | Sam | 60000 | Null |

| 4 | Max | 90000 | Null |

+----+-------+--------+-----------+

输出:

+----------+

| Employee |

+----------+

| Joe |

+----------+

解释: Joe 是唯一挣得比经理多的雇员。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 描述
    • 问题背景
    • 输入输出示例
  • SQL 解法
  • Swift 题解代码
  • Swift 题解代码分析
    • SQL 查询解析
    • Swift 数据库操作
    • 结果存储
  • 示例测试及结果
    • 测试 1
  • 时间复杂度
    • SQL 查询
  • 空间复杂度
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档