leetcode MySQL 实现交换工资问题
时间:2022-07-23
本文章向大家介绍leetcode MySQL 实现交换工资问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
leetcode MySQL 实现交换工资问题,不是很难,但是有一个解题思路特别有意思。
题目分析
因为题目不是很长,这里把题目贴出来:
给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。
注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。
例如:
| id | name | sex | salary |
|----|------|-----|--------|
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
运行你所编写的更新语句之后,将会得到以下表:
| id | name | sex | salary |
|----|------|-----|--------|
| 1 | A | f | 2500 |
| 2 | B | m | 1500 |
| 3 | C | f | 5500 |
| 4 | D | m | 500 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-salary
题目意思很简单,就是交换性别,将原来所有是男生的变成女生,所有女生变成男生,而且只能用一个 UPDATE 语句实现,任何 SELECT 语句都不能出现,意味着不能先查询后更新,必须是一次性实现这个效果。
参考答案
首先,如果熟悉 MySQL 语法的很容易想到用 IF 或者 CASE WHEN,答案如下:
-- 使用 CASE
UPDATE salary
SET sex = CASE
WHEN sex = 'm' THEN 'f'
ELSE 'm'
END;
-- 使用 IF
UPDATE salary
SET sex = if(sex = 'f', 'm', 'f');
如果对 CASE WHEN 和 IF 语法不熟悉的,可以再换种思路。交换“性别”,我们可以转换为代码中的交换“变量”,不能用到 SELECT ,不就很像在代码中交换“变量”时,不能引入其他变量吗?于是,这个题目就转换为:
如何在不引入中间变量的情况下,交换两个变量的值呢?
你可能会说,在 Python 中本来就不需要中间变量,一行代码就搞定:
a, b = b, a
但如果是其他语言呢?或者让你来实现 Python 的这种方式呢?很明显也是有方法的,这也是经常会遇到的一个笔试题,关键点在于:
b = a + b - a
a = a + b - b
# 交换变量,只需要交换
a = a + b
b = a - b # b 变成了 a
a = a - b # a 变成了 b
利用这一个思想,我们只需要拿到和,再用 “和” 减去当前的 “性别”,即可改变性别。而这里的 “性别” 是字符,显然字符是可以转换为 ascii 变为对应的数字的,因此题目就变得简单了,答案如下:
UPDATE salary
SET sex = char(ascii('f') + ASCII('m') - ASCII(sex));
总结
- 注意 “和” 的思想
- 代码中如何实现不引入其他变量达到变换变量的目的,对于这一实现,除了上面说的方式,还有另外一种,即按位异或,即思想是一样的,只是把 "+" 换成 "^"。参考如下:
a = a ^ b
b = a ^ b
a = a ^ b
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- YOLO算法最全综述:从YOLOv1到YOLOv5
- codeforce893C (并查集)
- codeforces 544C(完全背包求方案数)
- SCU2511(单调栈)
- B. Ternary String(贪心)
- codeforces 940B(贪心)
- codeforces 429A(dfs)
- codeforces 1182B (DFS)
- codeforces 509B(构造,思维)
- codeforces 1257C(map)
- codeforces 977D(DFS)
- codeforces 580C(dfs)
- codeforces 1155B(博弈)
- XXXXX codeforces1364A(数学)
- JAVA入门学习十一