The "Calculate Special Bonus" problem requires you to process a list of employees, each with a unique employee_id
and a name
. For each employee, you need to compute a bonus
value based on the following rules:
employee_id
is an odd number and the name
does not start with the character 'M', then the bonus
is equal to the salary
of that employee.bonus
is 0
.
The output should return a list of employees with their employee_id
and corresponding bonus
, sorted by employee_id
in ascending order.
Key constraints:
employee_id
is unique.
When approaching this problem, the first step is to clarify the filtering rules: we need to check two conditions for each employee — whether their employee_id
is odd and whether their name
does not start with 'M'. If both are true, we assign their salary
as their bonus
; otherwise, the bonus
is zero.
The naive approach would be to iterate through each employee, check the conditions, and assign the bonus
accordingly. Since there are no complex dependencies or relationships between employees, we don't need to worry about advanced data structures or algorithms.
The main optimization is simply to process each record in a single pass, applying the rules directly. This is efficient and straightforward.
Let's break down the solution step by step:
employee_id
, name
, and salary
.
employee_id
odd? (You can check this by employee_id % 2 == 1
)name
NOT start with 'M'? (You can check this by name[0] != 'M'
or using string methods)bonus = salary
.bonus = 0
.employee_id
and computed bonus
.
employee_id
in ascending order.
This approach is efficient because it only requires a single pass through the data and uses simple operations for filtering and assignment. No extra data structures are needed beyond a list to store the output.
Let's consider the following sample input:
Now, let's process each employee:
employee_id
is 2 (even), so bonus = 0
.
employee_id
is 3 (odd), name
does not start with 'M', so bonus = 200
.
employee_id
is 7 (odd), name
starts with 'M', so bonus = 0
.
employee_id
is 5 (odd), name
does not start with 'M', so bonus = 400
.
The output, sorted by employee_id
:
Brute-force approach:
There is no meaningful difference between brute-force and optimized approaches in this problem, as the most direct solution is already optimal.
The key to solving the "Calculate Special Bonus" problem is to apply the filtering rules directly and efficiently as you process each employee. By checking the employee_id
and name
conditions, you can assign the correct bonus
in a single pass. The solution is straightforward, efficient, and easy to implement, making it a good example of how clear problem requirements can lead to an elegant and simple algorithm.
def calculate_special_bonus(employees):
# employees: List[dict] with keys 'employee_id', 'name', 'salary'
result = []
for emp in employees:
eid = emp['employee_id']
name = emp['name']
salary = emp['salary']
if eid % 2 == 1 and not name.startswith('M'):
bonus = salary
else:
bonus = 0
result.append({'employee_id': eid, 'bonus': bonus})
# Sort by employee_id
result.sort(key=lambda x: x['employee_id'])
return result
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Employee {
int employee_id;
string name;
int salary;
};
struct Result {
int employee_id;
int bonus;
};
vector<Result> calculateSpecialBonus(vector<Employee>& employees) {
vector<Result> result;
for (const auto& emp : employees) {
int bonus = 0;
if (emp.employee_id % 2 == 1 && (emp.name.empty() || emp.name[0] != 'M')) {
bonus = emp.salary;
}
result.push_back({emp.employee_id, bonus});
}
sort(result.begin(), result.end(), [](const Result& a, const Result& b) {
return a.employee_id < b.employee_id;
});
return result;
}
import java.util.*;
class Employee {
int employee_id;
String name;
int salary;
Employee(int id, String n, int s) {
employee_id = id;
name = n;
salary = s;
}
}
class Result {
int employee_id;
int bonus;
Result(int id, int b) {
employee_id = id;
bonus = b;
}
}
public class Solution {
public List<Result> calculateSpecialBonus(List<Employee> employees) {
List<Result> result = new ArrayList<>();
for (Employee emp : employees) {
int bonus = 0;
if (emp.employee_id % 2 == 1 && !emp.name.startsWith("M")) {
bonus = emp.salary;
}
result.add(new Result(emp.employee_id, bonus));
}
result.sort(Comparator.comparingInt(a -> a.employee_id));
return result;
}
}
function calculateSpecialBonus(employees) {
// employees: Array of objects {employee_id, name, salary}
let result = [];
for (let emp of employees) {
let bonus = 0;
if (emp.employee_id % 2 === 1 && !emp.name.startsWith('M')) {
bonus = emp.salary;
}
result.push({employee_id: emp.employee_id, bonus: bonus});
}
result.sort((a, b) => a.employee_id - b.employee_id);
return result;
}