1873. 计算特殊奖金
1873. 计算特殊奖金
题目
Table: Employees
+-------------+---------+ | Column Name | Type | +-------------+---------+ | employee_id | int | | name | varchar | | salary | int | +-------------+---------+
employee_id is the primary key (column with unique values) for this table.
Each row of this table indicates the employee ID, employee name, and salary.
Write a solution to calculate the bonus of each employee. The bonus of an employee is 100%
of their salary if the ID of the employee is an odd number and **the employee 's name does not start with the character **'M'
. The bonus of an employee is 0
otherwise.
Return the result table ordered by employee_id
.
The result format is in the following example.
Example 1:
Input:
Employees table:
+-------------+---------+--------+ | employee_id | name | salary | +-------------+---------+--------+ | 2 | Meir | 3000 | | 3 | Michael | 3800 | | 7 | Addilyn | 7400 | | 8 | Juan | 6100 | | 9 | Kannon | 7700 | +-------------+---------+--------+
Output:
+-------------+-------+ | employee_id | bonus | +-------------+-------+ | 2 | 0 | | 3 | 0 | | 7 | 7400 | | 8 | 0 | | 9 | 7700 | +-------------+-------+
Explanation:
The employees with IDs 2 and 8 get 0 bonus because they have an even employee_id.
The employee with ID 3 gets 0 bonus because their name starts with 'M'.
The rest of the employees get a 100% bonus.
题目大意
表: Employees
+-------------+---------+ | Column Name | Type | +-------------+---------+ | employee_id | int | | name | varchar | | salary | int | +-------------+---------+
employee_id 是这个表的主键(具有唯一值的列)。
此表的每一行给出了雇员 id ,名字和薪水。
编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 'M'
开头 ,那么他的奖金是他工资的 100%
,否则奖金为 0
。
返回的结果按照 employee_id
排序。
返回结果格式如下面的例子所示。
示例 1:
输入:
Employees 表:
+-------------+---------+--------+ | employee_id | name | salary | +-------------+---------+--------+ | 2 | Meir | 3000 | | 3 | Michael | 3800 | | 7 | Addilyn | 7400 | | 8 | Juan | 6100 | | 9 | Kannon | 7700 | +-------------+---------+--------+
输出:
+-------------+-------+ | employee_id | bonus | +-------------+-------+ | 2 | 0 | | 3 | 0 | | 7 | 7400 | | 8 | 0 | | 9 | 7700 | +-------------+-------+
解释:
因为雇员 id 是偶数,所以雇员 id 是 2 和 8 的两个雇员得到的奖金是 0。
雇员 id 为 3 的因为他的名字以'M'开头,所以,奖金是 0。
其他的雇员得到了百分之百的奖金。
解题思路
MySQL
返回字段:
使用SELECT
指定返回字段:employee_id
:雇员 ID。- 计算奖金并命名为
bonus
。
奖金计算逻辑:
使用CASE
表达式计算奖金:- 如果雇员 ID 是奇数 (
employee_id % 2 = 1
) 且名字不是以'M'
开头 (name NOT LIKE 'M%'
),则奖金等于工资(salary
)。 - 否则奖金为
0
。
- 如果雇员 ID 是奇数 (
排序要求:
按employee_id
进行升序排序。
复杂度分析
- 时间复杂度:
O(n)
,假设表中有n
条记录,需要对所有记录应用条件筛选和奖金计算。 - 空间复杂度:SQL 查询本身不占用额外空间,返回的结果占用的空间与记录数成正比。
Pandas
加载数据:
将Employees
表加载到 Pandas 的DataFrame
中。奖金计算逻辑:
使用 Pandas 的布尔索引和条件判断:- 如果
employee_id
是奇数且name
列的值不以'M'
开头,则奖金等于对应的salary
值。 - 否则奖金为
0
。
- 如果
结果选择与排序:
返回结果包含employee_id
和计算后的bonus
,按employee_id
升序排列。
代码
SELECT employee_id,
CASE
WHEN employee_id % 2 = 1 AND name NOT LIKE 'M%' THEN salary
ELSE 0
END AS bonus
FROM Employees
ORDER BY employee_id;
import pandas as pd
def calculate_bonus(employees: pd.DataFrame) -> pd.DataFrame:
# 条件判断:计算奖金
employees['bonus'] = employees.apply(
lambda row: row['salary'] if row['employee_id'] % 2 == 1 and not row['name'].startswith('M') else 0, axis=1
)
# 返回结果并按 employee_id 排序
return employees[['employee_id', 'bonus']].sort_values(by='employee_id')