I apologize I am not sharing the exact company name as I signed an NDA
(but its a famous faang subsidiary/startup).
This could be applicable for any interview preparation.
Airlines have ticket classes named "Economy", "Business" "FirstClass".
Ticket prices depend on an operating cost (per ticket) which is same for all airlines.
Airlines decides on the ticket price based on the operating cost, mileage and ticket class.
We have tickets with Airlinename, className and mileage. The table below explains that.
vector<vector<string>> tickets = { {"American", "Economy", "120.0"}, {"RyanAir", "Business", "100.0"}};
```
An example economy class operating cost per ticket (for the following table would be) = 50.0 + 0.05 *mileage.vector <vector<string>> operatingCostInitData = { {"Economy", "50.0", ".05"},
{"Business", "100.0", ".15"}, {"FirstClass", "150.0", ".25"} };
The program should print the ticket price for all the tickets.
The airlines have their own ticket price rules.
For example American is charging the operating cost + 1 dollar per mile.
RyanAir is charging the maximum of twice the operating cost and
mileage cost (1.5 dollars per mile).
I could not finish the code. This is the direction I was going.
The ticketing rules can be more complicated, for example a specific airline
might have a table for picking price for different ticket classes.
I struggled to come up with solutions for the strategy and factory patterns
in the 45 minutes interview window.
I would love to see others' solutions.
``
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct operatingCostParam {
double baseOperatingCost;
double perMileCost;
};
struct operatingCost {
unordered_map<string, operatingCostParam> opCostVals;
operatingCost(vector < vector<string>> operatingCostInitData) {
for (auto costdata : operatingCostInitData) {
string ticketClass = costdata[0];
string basecost = costdata[1];
string perMileCost = costdata[2];
opCostVals[ticketClass] = { stod(basecost), stod(perMileCost) };
}
}
double getCost(double mileage, string ticketClass) {
return opCostVals[ticketClass].baseOperatingCost
+ opCostVals[ticketClass].perMileCost * mileage;
}
};
struct Ticket {
string ticketclass;
operatingCost ocost;
Ticket(string ticketclass, operatingCost ocost) : ticketclass(ticketclass), ocost(ocost) {}
virtual double getTicketPrice() = 0;
};
struct AmericanAirlinesTicket:Ticket {
string ticketClass;
double mileage;
AmericanAirlinesTicket(string ticketClass, string mileage, operatingCost ocost):
ticketClass(ticketClass), mileage(stod(mileage)), Ticket (ticketClass, ocost) {}
double getTicketPrice() {
double operatingCost = ocost.getCost(mileage, ticketClass);
return mileage + operatingCost;
}
};
struct RyanAirTicket :Ticket {
string ticketClass;
double mileage;
RyanAirTicket(string ticketClass, string mileage, operatingCost ocost) :
ticketClass(ticketClass), mileage(stod(mileage)), Ticket(ticketClass, ocost) {}
double getTicketPrice() {
double operatingCost = ocost.getCost(mileage, ticketClass);
return max (1.5*mileage, 2*operatingCost);
}
};
struct TicketFactory {
operatingCost ocost;
TicketFactory(vector < vector<string>> operatingCostInitData) : ocost(operatingCostInitData) {}
Ticket *createTicket(string airline, string ticketClass, string mileage) {
if (airline == "RyanAir") {
return new RyanAirTicket(ticketClass, mileage, ocost);
}
else if (airline == "American") {
return new AmericanAirlinesTicket(ticketClass, mileage, ocost);
}
}
};
int main()
{
vector <vector<string>> operatingCostInitData = { {"Economy", "50.0", ".05"},
{"Business", "100.0", ".15"}, {"FirstClass", "150.0", ".25"} };
vector<vector<string>> tickets = { {"American", "Economy", "120.0"}, {"RyanAir", "Business", "100.0"}};
TicketFactory ticketFactory(operatingCostInitData);
for (auto ticket : tickets) {
string airlineName = ticket[0];
string ticketClass = ticket[1];
string mileage = ticket[2];
cout << airlineName << " " << ticketClass << " " << ticketFactory.createTicket(airlineName, ticketClass, mileage)->getTicketPrice() << endl;
}
}