欢迎光临
我们一直在努力

leetCode 627 变更性别

LeetCode 627 题目

题号:627 标题:变更性别(Swap Salary)难度:简单(数据库题,LeetCode支持Pandas/Python解法)

题目描述

Salary 表:

Column NameType
id int
name varchar
sex ENUM
salary int
  • id 是这张表主键
  • sex 字段是枚举类型,只能是 'm'(男)、'f'(女)
  • 表存储员工信息

需求:
交换表里面所有 f 和 m。所有 f 改成 m,所有 m 改成 f。
要求:只用单条更新语句,不能创建临时中间表。

原题是SQL题;LeetCode现在支持Pandas(Python)提交版本,我们重点讲Python Pandas解法。

样例

输入Salary表

idnamesexsalary
1 A m 2500
2 B f 1500
3 C m 5500
4 D f 500

输出交换sex后的表

idnamesexsalary
1 A f 2500
2 B m 1500
3 C f 5500
4 D m 500

费曼学习法:破解思路讲解(通俗讲,像教小白)

费曼核心:用最简单语言讲清楚,不要术语堆砌,找到卡点,简化模型。

1. 先看懂题目本质

很多人第一眼会以为:

我先把所有m改成f,再把所有f改成m。
❌ 这个思路大坑!
举例子:
原始:m
第一步全部m→f,这一行变成f;
第二步再把f→m,它又变回m,等于白改!

👉 不能分两次批量更新!必须:读取当前这一行sex的值,当场判断并替换成相反值,一次性完成整表更新。

核心逻辑:
对每一行:
如果 sex == ‘m’ → 新值=‘f’
否则 sex == ‘f’ → 新值=‘m’

2. 两种实现思路(Python Pandas)

思路1:apply逐行遍历(好理解,适合新手)

apply,axis=1代表一行一行拿数据。
lambda表达式对每行的sex做if判断,返回反转后的字符,重新赋值给sex整列。
优点:逻辑直观,一眼看懂条件;缺点:大数据量时逐行循环,性能一般。

思路2:map字典映射(推荐,性能更高)

建立映射字典 {'m':'f', 'f':'m'}
直接对sex列做map,一键批量替换。
优点:向量化运算,速度更快,Pandas推荐写法,代码极简。

费曼小结:
这题的考点不是复杂算法,是原地条件替换,避免覆盖污染原始数据。
关键点:读取原始值的瞬间计算新值,不能先覆盖原始字段再二次替换。

3. 应用场景举例

  • 企业员工数据脱敏/性别字段批量反转测试:测试报表系统,临时把男女标签互换,验证统计报表逻辑是否正确。
  • 数据校验:构造反向数据集,验证男女分组求和、人数统计的业务代码有没有bug。
  • 数据库批量枚举字段翻转:任何二分类标签互换(是/否,启用/禁用,男/女)。
  • 现实中注意:生产环境不要随便直接原地更新,一般先备份!


    Python Pandas 完整代码,每行详细注释

    LeetCode Pandas函数模板:传入DataFrame,返回修改后的DataFrame

    解法1 apply逐行版本(最容易理解)

    # 导入pandas库,LeetCode环境自带pandas,不用额外安装
    import pandas as pd

    def swap_salary(salary: pd.DataFrame) –> pd.DataFrame:
    # salary 是输入的DataFrame,对应题目Salary表
    # 我们重新赋值sex这一列
    # apply(axis=1): 逐行处理,x代表当前这一行
    # lambda匿名函数:判断该行sex字段
    # 如果x.sex等于'm'返回'f',否则返回'm'
    salary["sex"] = salary.apply(
    lambda x: "f" if x["sex"] == "m" else "m",
    axis=1
    )
    # 返回修改完成后的DataFrame
    return salary

    解法2 map字典映射版本(性能更好,推荐)

    # 导入pandas库
    import pandas as pd

    def swap_salary(salary: pd.DataFrame) –> pd.DataFrame:
    # 建立映射字典,key=原值,value=替换后的值
    sex_map = {'m': 'f', 'f': 'm'}
    # map函数:遍历sex列每个元素,按字典自动替换
    # 向量化操作,不是逐行循环,大数据量更快
    salary["sex"] = salary["sex"].map(sex_map)
    # 返回结果
    return salary

    本地测试完整可运行代码(可以复制直接跑,验证效果)

    import pandas as pd

    def swap_salary(salary: pd.DataFrame) –> pd.DataFrame:
    sex_map = {'m': 'f', 'f': 'm'}
    salary["sex"] = salary["sex"].map(sex_map)
    return salary

    # ========== 本地构造样例数据,测试 ==========
    if __name__ == "__main__":
    # 构造样例输入表
    data = [
    [1, "A", "m", 2500],
    [2, "B", "f", 1500],
    [3, "C", "m", 5500],
    [4, "D", "f", 500]
    ]
    # 创建DataFrame,设置列名
    df = pd.DataFrame(data, columns=["id", "name", "sex", "salary"])
    print("====原始表====")
    print(df)
    # 调用函数交换性别
    df_result = swap_salary(df)
    print("\\n====交换sex之后====")
    print(df_result)

    运行输出

    ====原始表====
    id name sex salary
    0 1 A m 2500
    1 2 B f 1500
    2 3 C m 5500
    3 4 D f 500

    ====交换sex之后====
    id name sex salary
    0 1 A f 2500
    1 2 B m 1500
    2 3 C f 5500
    3 4 D m 500

    补充:原题SQL解法(供对照理解,原题要求SQL)

    — IF版本
    UPDATE Salary
    SET sex = IF(sex='m','f','m');

    — CASE WHEN版本
    UPDATE Salary
    SET sex = CASE sex
    WHEN 'm' THEN 'f'
    ELSE 'm'
    END;

    费曼复盘(自我提问检验你是否学会)

    Q:能不能先全部m改成f,再全部f改成m?
    A:不行,因为原始m变成f之后,第二轮会把刚改好的f再变回m,等于没变化。

    Q:map和apply区别?
    A:map是针对单列每个元素,向量化,速度快;apply(axis=1)拿整行数据,循环慢,适合需要多列判断场景。

    Q:适用场景局限?
    A:只适合二值互换,如果sex存在其他值,map会生成NaN,业务里要提前清洗数据。

    如果你想,我可以继续给你出2道同类型二分类字段翻转练习题,巩固这个思路。

    赞(0)
    未经允许不得转载:171主机测评 » leetCode 627 变更性别
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址