Track Workers, Sessions, Promotions, and Bonus Pay

Read the full interview experience this question came from →

Quick Overview

Implement worker sessions, current metadata, promotions, ordered filtering, and time-clipped compensation with historical rates and non-stacking double-pay intervals.

Track Workers, Sessions, Promotions, and Bonus Pay

Role: Software Engineer

Category: Coding & Algorithms

Difficulty: easy

Interview Round: Online Assessment

Implement a worker registry with working sessions, promotion and salary updates, filtering, and compensation queries. Bonus periods pay double the normal rate. Implement `worker_payroll(operations: string[][]) -> string[][]`, returning one string-array result for each operation. This operation encoding and the timing policies below are explicit practice choices because the reported assessment provides features rather than an exact API. ### Constraints & Assumptions - At most 2000 operations and 200 workers. Names and levels are nonempty ASCII letters/digits/underscores. Worker names are unique and immutable. - Times are integer minutes from 0 through 1000000. Rates are integer cents per minute from 0 through 1000000. Use wide integers for compensation. - All inputs satisfy the preconditions below. No invalid-operation handling is required. Each worker alternates ENTER and LEAVE; all recorded sessions have positive duration and never overlap for that worker. - ADD, UPDATE, and PROMOTE occur while that worker is outside. A session keeps the rate in effect when it began. Updates do not change historical session pay. - All TOTAL queries occur when every worker is outside. All sessions relevant to the query have already been recorded. BONUS periods are global and may be added before a query; overlapping bonus periods form a union and never multiply pay more than twice. - Intervals are half-open `[start,end)`. A TOTAL query clips every recorded session to the requested interval. ### Operations and Results - `["ADD",name,level,rate]`: add a worker; return `["OK"]`. - `["GET",name]`: return `[name,currentLevel,currentRate]`. - `["UPDATE",name,level,rate]` and `["PROMOTE",name,newLevel,newRate]`: replace the current level and rate; return `["OK"]`. PROMOTE is a separately named business action with the same immediate update timing in this practice contract. - `["ENTER",name,time]`, `["LEAVE",name,time]`: open or close a session; return `["OK"]`. - `["FILTER",field,value,sortField]`: select current workers whose `name`, `level`, or `rate` equals value. Sort ascending by `name`, `level`, or numeric `rate` as specified by sortField, breaking ties by name. Return the selected names, possibly an empty array. - `["BONUS",start,end]`: record a positive-length double-pay interval; return `["OK"]`. - `["TOTAL",start,end]`: return `[totalCents]` for all workers combined, with no decimal point or leading zeroes except `0`. All integer arguments and results use ordinary base-10 strings. FILTER uses exact case-sensitive equality. The source does not require an asymptotically optimal data structure; explain the complexity of the representation you choose. ### Example ```text operations = [["ADD","Ada","L1","10"],["ENTER","Ada","0"], ["LEAVE","Ada","10"],["BONUS","3","5"],["TOTAL","0","10"], ["PROMOTE","Ada","L2","20"],["GET","Ada"]] result = [["OK"],["OK"],["OK"],["OK"],["120"],["OK"],["Ada","L2","20"]] ``` ```hint Preserve historical rates A worker's current salary is insufficient to price an old session after a promotion. Store the rate with the completed session and count each minute of overlapping bonus intervals only once. ```

Overview: Implement worker sessions, current metadata, promotions, ordered filtering, and time-clipped compensation with historical rates and non-stacking double-pay intervals.

Read the full Software Engineer interview experience this question came from

|Home/Coding & Algorithms
Sep 18, 2026
easySoftware EngineerOnline AssessmentCoding & Algorithms
0
0

Implement a worker registry with working sessions, promotion and salary updates, filtering, and compensation queries. Bonus periods pay double the normal rate.

Implement worker_payroll(operations: string[][]) -> string[][], returning one string-array result for each operation. This operation encoding and the timing policies below are explicit practice choices because the reported assessment provides features rather than an exact API.

Constraints & Assumptions

  • At most 2000 operations and 200 workers. Names and levels are nonempty ASCII letters/digits/underscores. Worker names are unique and immutable.
  • Times are integer minutes from 0 through 1000000. Rates are integer cents per minute from 0 through 1000000. Use wide integers for compensation.
  • All inputs satisfy the preconditions below. No invalid-operation handling is required. Each worker alternates ENTER and LEAVE; all recorded sessions have positive duration and never overlap for that worker.
  • ADD, UPDATE, and PROMOTE occur while that worker is outside. A session keeps the rate in effect when it began. Updates do not change historical session pay.
  • All TOTAL queries occur when every worker is outside. All sessions relevant to the query have already been recorded. BONUS periods are global and may be added before a query; overlapping bonus periods form a union and never multiply pay more than twice.
  • Intervals are half-open [start,end) . A TOTAL query clips every recorded session to the requested interval.

Operations and Results

  • ["ADD",name,level,rate] : add a worker; return ["OK"] .
  • ["GET",name] : return [name,currentLevel,currentRate] .
  • ["UPDATE",name,level,rate] and ["PROMOTE",name,newLevel,newRate] : replace the current level and rate; return ["OK"] . PROMOTE is a separately named business action with the same immediate update timing in this practice contract.
  • ["ENTER",name,time] , ["LEAVE",name,time] : open or close a session; return ["OK"] .
  • ["FILTER",field,value,sortField] : select current workers whose name , level , or rate equals value. Sort ascending by name , level , or numeric rate as specified by sortField, breaking ties by name. Return the selected names, possibly an empty array.
  • ["BONUS",start,end] : record a positive-length double-pay interval; return ["OK"] .
  • ["TOTAL",start,end] : return [totalCents] for all workers combined, with no decimal point or leading zeroes except 0 .

All integer arguments and results use ordinary base-10 strings. FILTER uses exact case-sensitive equality. The source does not require an asymptotically optimal data structure; explain the complexity of the representation you choose.

Example

operations = [["ADD","Ada","L1","10"],["ENTER","Ada","0"],
 ["LEAVE","Ada","10"],["BONUS","3","5"],["TOTAL","0","10"],
 ["PROMOTE","Ada","L2","20"],["GET","Ada"]]
result = [["OK"],["OK"],["OK"],["OK"],["120"],["OK"],["Ada","L2","20"]]

Submit Your Answer to Earn 20XP

Sign in to leave a comment

Loading comments...