I recently prepared for a Wayfair L3 machine coding round, and one of the frequently asked questions is the Shipment & Package Management System. Here’s the problem statement, my approach, and an optimized Java solution. Hope this helps! 🚀
Design a Shipment & Package Management System with the following features:
1️⃣ Add a package to the system → addPackage(packageId, weight, distance).
2️⃣ Assign packages to a shipment → assignShipment(shipmentId).
3️⃣ Calculate total shipment cost → calculateShipmentCost(shipmentId).
4️⃣ Track shipment status → trackShipment(shipmentId).
5️⃣ Update shipment status → updateShipmentStatus(shipmentId, status).
✅ Each shipment has a weight limit of 100 kg.
✅ Packages should be prioritized by weight (heaviest first).
✅ Shipment cost formula:
[
\text{Cost} = \text{$10 (Base Fee)} + (2 \times \text{Total Weight}) + (5 \times \frac{\text{Total Distance}}{100})
]
O(N log N))./*📌 3️⃣ Shipment & Package Management System
Problem Statement:
Design a Shipment & Package Management System with the following features:
1. Add a package to a shipment (addPackage(packageId, weight, destination)).
2. Assign packages to shipments (assignShipment(shipmentId)).
3. Calculate total shipment cost based on package weight & distance.
4. Track shipment status (Pending, In Transit, Delivered).
🔹 Constraints:
✅ Each shipment has a weight limit of 100 kg.
✅ Packages should be prioritized based on weight (heavier first).
✅ Cost = Base Fee ($10) + $2 per kg + $5 per 100 miles.
*/
import java.util.*;
class ShipmentSystem
{
PriorityQueue<int[]> pq=new PriorityQueue<>((a,b)->b[1]-a[1]);
HashMap<Integer,List<int[]>> shipments=new HashMap<>();
HashMap<Integer,String> shipmentStatus=new HashMap<>();
public void addPackage(int packageId, int weight, int distance)
{
pq.add(new int[]{packageId, weight, distance});
}
public void assignShipment(int shipmentId)
{
if (shipments.containsKey(shipmentId)) {
throw new IllegalArgumentException("Shipment ID already exists!");
}
int weight=0;
List<int[]> tmp=new ArrayList<>();
while(!pq.isEmpty() && weight+pq.peek()[1]<=100)
{
int[] pkg=pq.remove();
tmp.add(pkg);
weight=weight+pkg[1];
}
shipments.put(shipmentId, tmp);
shipmentStatus.put(shipmentId, "Pending");
}
public void calculateShipmentCost(int shipmentId) //based on pkg weight,distance
{
if(!shipments.containsKey(shipmentId))
throw new IllegalArgumentException("Invalid shipment id!");
List<int[]> shipmentList=shipments.get(shipmentId);
double totalCost=0;
for(int[] pkg:shipmentList)
{
double cost=pkg[1]*2+(5*pkg[2]/100);
totalCost+=cost;
}
totalCost+=10;
System.out.println("Cost of shipment id: "+shipmentId+" = "+totalCost);
}
public void trackShipment(int shipmentId) //(Pending, In Transit, Delivered)
{
if(!shipmentStatus.containsKey(shipmentId))
throw new IllegalArgumentException("Invalid shipment id!");
System.out.println(shipmentStatus.get(shipmentId));
}
public void updateShipmentStatus(int shipmentId, String status) {
if (!shipmentStatus.containsKey(shipmentId))
throw new IllegalArgumentException("Invalid shipment id!");
shipmentStatus.put(shipmentId, status);
}
}
class Solution
{
public static void main(String[] args)
{
ShipmentSystem obj=new ShipmentSystem();
obj.addPackage(1, 30, 500);
obj.addPackage(2, 50, 1200);
obj.addPackage(3, 20, 800);
obj.assignShipment(101);
obj.trackShipment(101);
obj.updateShipmentStatus(101, "In Transit");
obj.trackShipment(101);
obj.calculateShipmentCost(101);
obj.updateShipmentStatus(101, "Delivered");
obj.trackShipment(101);
}
}
| Operation | Time Complexity | Explanation |
|---|---|---|
Adding a package (addPackage()) | O(log N) | Insert into PriorityQueue (Max Heap). |
Assigning a shipment (assignShipment()) | O(N log N) | Extract from heap (N log N sorting). |
Tracking a shipment (trackShipment()) | O(1) | Direct HashMap lookup. |
Calculating cost (calculateShipmentCost()) | O(N) | Iterating over all packages in shipment. |
✅ Most expensive operation is assignShipment(), but it's already optimal at O(N log N).
✅ No unnecessary computations or redundant data structures.
If you finish coding early, the interviewer may ask follow-up questions:
✅ Use database storage instead of in-memory HashMap.
✅ Use Redis caching for frequently accessed shipment details.
✅ Implement batch processing instead of real-time calculations.
✅ Modify the PriorityQueue comparator to prioritize based on shipment type.
✅ Add a packageStatus HashMap to store "Pending", "In Transit", "Delivered" per package.
📌 Similar machine coding interview questions:
🔹 Wayfair L3 Interview – Bangalore (LeetCode)
🔹 Wayfair Machine Coding Round Prep – Q4 2024