LeetCode 627 题目
题号:627 标题:变更性别(Swap Salary)难度:简单(数据库题,LeetCode支持Pandas/Python解法)
题目描述
Salary 表:
| 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表
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
输出交换sex后的表
| 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. 应用场景举例
现实中注意:生产环境不要随便直接原地更新,一般先备份!
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道同类型二分类字段翻转练习题,巩固这个思路。





