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