Generalize the previous version: give bonuses to the top K most productive employees, where k is given as a variable. Still no sorting: repeat the search for the best employee k times, and remember who already won so nobody wins twice.
You start with:
const names: string[] = ["John Doe", "Mary Jane", "Bob Smith", "Alice Chen", "Carlos Diaz"];
const productivities: number[] = [83, 133, 97, 150, 120];
const salaries: number[] = [135000, 335000, 210000, 250000, 180000];
const k: number = 3;
Build:
Alice Chen: $37500 Mary Jane: $50250 Carlos Diaz: $27000
Rules:
- Index
iin all three arrays refers to the same employee. - Round 1 finds the employee with the highest productivity, round 2 the best among the employees who have not won yet, and so on, for
krounds. - If two employees have the same productivity, the one listed first wins.
- Each bonus is 15% of the salary, rounded down (with
Math.floor). - Print one line per winner, best first:
name: $bonus. - If
kis larger than the number of employees, everybody wins once and you print one line per employee: when nobody is left, a round prints nothing. - Your code must keep working when
kchanges to 1, 2, 5 or 7.
Use a list of booleans:
const taken: boolean[] = new Array(names.length).fill(false);. A round finds the best employee among those who are not taken yet, then marks that employee as taken.
The outer loop runs
k times and the inner loop is the search from v4 with one more condition: if (!taken[i] && (bestIndex === -1 || productivities[i] > productivities[bestIndex])) {. If nobody is found in a round, skip the rest of that round.
const names: string[] = ["John Doe", "Mary Jane", "Bob Smith", "Alice Chen", "Carlos Diaz"];
const productivities: number[] = [83, 133, 97, 150, 120];
const salaries: number[] = [135000, 335000, 210000, 250000, 180000];
const k: number = 3;
const taken: boolean[] = new Array(names.length).fill(false);
for (let rank: number = 0; rank < k; rank++) {
let bestIndex: number = -1;
for (let i: number = 0; i < names.length; i++) {
if (!taken[i] && (bestIndex === -1 || productivities[i] > productivities[bestIndex])) {
bestIndex = i;
}
}
if (bestIndex !== -1) {
taken[bestIndex] = true;
const bonus: number = Math.floor(salaries[bestIndex] * 15 / 100);
console.log(names[bestIndex] + ": $" + bonus);
}
}
Free plan: 30 tutor messages. Premium is unlimited.
Saved
Ctrl + Enter to check
