Amazon Interview Question
SDE1sTeam: Advertising
Country: United States
Interview Type: In-Person
class Valet
// park car to a particular spot. return a ticket if success
Ticket parkAt (Car car, Spot spot)
// park car, return a ticket if success
Ticket park (Car car)
// find a suitable spot for car. return null if no spot can fit car
Spot findSpot(Car car)
// where is car in the parking lot?
Spot findCar(Ticket ticket)
// is the parking lot full
boolean isFull()
// redeem ticket. return spot if sucess
Spot redeem(Ticket ticket)
}
Class Ticket {
// to create a ticket, you need a car and a spot
Ticket (Car car, Spot spot)
}
Car : size, ...
Spot: size, location...
Problem needs inheritance approach with predefined size of total number of small,medium & large parking slot available.
i.e
long TotalSmallCarPark=100;
long TotalMediumCarPark=100;
long TotalLargeCarPark=100;
//or common size=100
//Parent class
class CValetParkingType
{
protected:
long TypSmall;
long TypMedium;
long TypLarge;
enum Type
{
Small=0,Medium=1,Large=2,NoParking=3
};
typedef enum Type m_Type;
public:
CValetParkingType();
m_Type ParkingSpotAvailablity(m_Type Typ);
..
};
CValetParkingType::CValetParkingType():TypSmall(0),TypMedium(0),TypLarge(0)
{}
m_Type CarType::ParkingSpotAvailability(m_Type Typ)
{
switch ( Typ )
{
//Size = 100 for example
case Small : TypSmall>=Size ? (TypMedium>=Size ? (TypLarge>=Size?
return(NoParking):return(Large)):return(Medium)):return(Small);
break;
case Medium : TypMedium>=Size?(TypLarge>=Size?return(NoPraking):
return(Large)):return(Medium));
break;
case Large : TypLarge >= Size ? Return(NoParking):return(Large);break;
}
}
class CValetParking : CValetParkingType
{
protected:
int TktId;
map<int,string> Parking;
public:
CValetParking();
void ParkVechicle(m_Type Typ);
};
CValetParking::CValetParking() : TktId(0)
{}
bool CValetParking::ParkVechile (m_Type Typ)
{
switch (ParkingSpotAvailability(Typ) )
{
case small :++TypSmall; Parking.insert(make_pair(TkId,Typ));break;
case Medium:++TypMedum;Parking.insert(make_pair(TkId,Typ));break;
case Large : ++TypLarge;Parking.insert(make_pair(TkId,Typ));break;
}
}
Similarly add method for GenerateTKID and Method to Release parking slot once the vehicle is moved out....
Datastructure..implementation will be stack.
typedef enum {
eSmall, eMedium, eBig
}size_t;
class Vehicle {
protected:
string mLicenseNo;
size_t mSize;
Vehicle (string licenseNo) {
mLicenseNo = licenseNo;
}
public:
string getLicenseNo () {
return mLicenseNo;
}
virtual size_t getSize () {
return mSize;
}
}
class SmallVehicle : public Vehicle {
public:
SmallVehicle (string license) :Vehicle (license), mSize(eSmall) {
}
}
class MediumVehicle : public Vehicle {
public:
MediumVehicle (string license) :Vehicle (license), mSize(eMedium) {
}
}
class BigVehicle : public Vehicle {
public:
BigVehicle (string license) :Vehicle (license), mSize(eBig) {
}
}
ParkingLot {
protected:
size_t mSize;
Vehicle mVehicle;
public:
ParkingLot (size_t size): mSize(size) {
}
size_t getSize () {
return mSize;
}
Vehicle getVehicle () {
return mVehicle;
}
}
BigLot : public ParkingLot {
public:
BigLot (Vehicle v):ParkingLot (eBig) {
mVehicle = v;
}
}
MediumLot : public ParkingLot {
public:
MediumLot (Vehicle v):ParkingLot (eMedium) {
mVehicle = v;
}
}
SmallLot : public ParkingLot {
public:
SmallLot (Vehicle v):ParkingLot (eSmall) {
mVehicle = v;
}
}
Ticket {
const int BASE_FARE = 10;
ParkingLot mLot;
int mFare;
public:
Ticket (ParkingLot lot):mLot(lot) {
mFare = mLot.getSize() * BASE_FARE;
}
int getFare () {
return mFare;
}
ParkingLot getLot () {
return mLot;
}
}
ParkingManager {
public:
ParkingManager () {
mTotalCollection = 0;
mBigLotCount = 0;
mMediumLotCount = 0;
mSmallLotCount = 0;
}
ParkingLot requestLot (Vehicle v) {
ParkingLot lot = null;
if (eSmall == v.getSize ()) {
lot = getSmallLot (v);
}
if ((null == lot) && (eBig != v.getSize ()) {
lot = getMediumLot (v);
}
if (null == lot) {
lot = getBigLot (v);
}
return lot;
}
Vehicle redeemTicket (Ticket t) {
ParkingLot lot = t.getLot ();
Vehicle v = lot.getVehicle ()
switch (lot.getSize ()) {
case eBig:
mBigLotCount--;
break;
case eMedium:
mMediumLotCount --;
break;
case eSmall:
mSmallLotCount--;
break;
}
delete lot;
delete t;
return v;
}
Ticket buyTicket (ParkingLot lot) {
Ticket t = new Ticket (lot);
mTotalCollection += t.getFare ();
return t;
}
private:
const int MAX_LOT = 20;
int mSmallLotCount;
int mMediumLotCount;
int mBigLotCount;
int mTotalCollection;
ParkingLot getSmallLot(Vehicle v) {
ParkingLot lot = null;
if (mSmallLotCount < MAX_LOT) {
mSmallLotCount++;
lot = new SmallLot (v);
}
return lot;
}
ParkingLot getMediumLot(Vehicle v) {
ParkingLot lot = null;
if (mMediumLotCount < MAX_LOT) {
mMediumLotCount++;
lot = new MediumLot (v);
}
return lot;
}
ParkingLot getBigLot(Vehicle v) {
ParkingLot lot = null;
if (mBigLotCount < MAX_LOT) {
mBigLotCount++;
lot = new BigLot (v);
}
return lot;
}
int main () {
ParkingManager mgr = new ParkingManager ();
Vehicle *v = new SmallVehicle ("AA BB CC");
Vehcle *big = new BigVehicle ("112233");
ParkingLot lot = mgr.requestLot (big);
if (null != lot) {
Ticket t = mgr.buyTicket (lot);
Vehicle vt = mgr.redeemTicket (t);
}
}
class Program
{
static void Main(string[] args)
{
List<ParkingPlace> parkingPlace = new List<ParkingPlace>();
parkingPlace.Add(new ParkingPlace("1", VehicleType.Small));
parkingPlace.Add(new ParkingPlace("1", VehicleType.Small));
parkingPlace.Add(new ParkingPlace("1", VehicleType.Medium));
parkingPlace.Add(new ParkingPlace("1", VehicleType.Medium));
parkingPlace.Add(new ParkingPlace("1", VehicleType.Large));
parkingPlace.Add(new ParkingPlace("1", VehicleType.Large));
ParkingArea parking = new ParkingArea(parkingPlace);
Console.WriteLine("Total Space available: {0}", parking.GetTotalCount());
Console.WriteLine("Total Free Space available: {0}", parking.GetAvailableCount());
Vehicle vehicle = new Vehicle("AZ AA109", VehicleType.Medium);
Customer customer = new Customer("Lokesh", vehicle);
customer.Entry(parking);
Console.WriteLine("Total Space available: {0}", parking.GetTotalCount());
Console.WriteLine("Total Free Space available: {0}", parking.GetAvailableCount());
Console.WriteLine("Do Some Fun Activity...");
customer.Exit(parking, 12.00);
Console.WriteLine("Total Space available: {0}", parking.GetTotalCount());
Console.WriteLine("Total Free Space available: {0}", parking.GetAvailableCount());
}
}
class Customer
{
private string _name;
private Ticket _ticket;
private Vehicle _vehicle;
public Customer(string name, Vehicle vehicle)
{
this._name = name;
this._vehicle = vehicle;
}
public void Entry(ParkingArea parking)
{
Ticket ticket = parking.GetTicket(this._vehicle.VehicleType);
if (ticket == null)
{
Console.WriteLine("No Parking Available.");
return;
}
this._ticket = ticket;
Console.WriteLine("{0} enterd the parking area", this._name);
}
public void Exit(ParkingArea parking, double price)
{
parking.Free(this._ticket, price);
Console.WriteLine("{0} exited from the parking area", this._name);
}
}
class ParkingArea
{
List<ParkingPlace> _parkingList = new List<ParkingPlace>();
List<Ticket> _soldTickets = new List<Ticket>();
private int _availCount;
public ParkingArea(List<ParkingPlace> parkingPlace)
{
this._parkingList = parkingPlace;
this._availCount = parkingPlace.Count;
}
public Ticket GetTicket(VehicleType type)
{
if (_availCount == 0) return null;
Ticket ticket = new Ticket();
ticket.ParkingSpot = this.Book(type);
ticket.ParkingSpot.Available = false;
return ticket;
}
private ParkingPlace Book(VehicleType type)
{
foreach (var item in _parkingList)
{
if (item.Available && item.VehicleType == type)
{
_availCount--;
return item;
}
}
return null;
}
public int GetTotalCount()
{
return _parkingList.Count;
}
public int GetAvailableCount()
{
return _availCount;
}
public void Free(Ticket ticket, double price)
{
ticket.OutTime = DateTime.Now;
ticket.Price = price;
ticket.ParkingSpot.Available = true;
_soldTickets.Add(ticket);
_availCount++;
}
}
class ParkingPlace
{
public ParkingPlace(string number, VehicleType type)
{
this._number = number;
this._vehicleType = type;
}
private string _number;
public string Number
{
get { return this._number; }
}
private VehicleType _vehicleType;
public VehicleType VehicleType
{
get { return this._vehicleType; }
}
private bool _avail = true;
public bool Available
{
get { return this._avail; }
set { this._avail = value; }
}
}
class Ticket
{
private string _receiptNumber;
public string ReceiptNo
{
get { return _receiptNumber; }
}
public double Price;
private DateTime _inTime = DateTime.MinValue;
public DateTime InTime
{
get { return _inTime; }
}
public DateTime OutTime = DateTime.MinValue;
public ParkingPlace ParkingSpot;
public Ticket()
{
this._receiptNumber = new Random().Next(10000).ToString();
this._inTime = DateTime.Now;
}
}
class Vehicle
{
private VehicleType _vehicleType;
public VehicleType VehicleType
{
get { return this._vehicleType; }
}
private string _number;
public string Number
{
get { return this._number; }
}
public string OwnerName;
public Vehicle(string number, VehicleType type)
{
this._number = number;
this._vehicleType = type;
}
}
enum Status
{
None,
In,
Out
}
enum VehicleType
{
Small,
Medium,
Large
}
public interface VehicalType{
public String getType();
}
public class SmallVehical implements VehicalType{
public String getType(){
return "small";
}
}
public class MediumVehical implements VehicalType{
public String getType(){
return "medium";
}
}
public class LargeVehical implements VehicalType{
public String getType(){
return "large";
}
}
public interface ParkingSpot{
public String getSpot();
}
public class SmallParkingSpot implements ParkingSpot{
public String getSpot(){
return "small";
}
}
public class MediumParkingSpot implements ParkingSpot{
public String getSpot(){
return "medium";
}
}
public class LargeParkingSpot implements ParkingSpot{
public String getSpot(){
return "large";
}
}
class Parking{
List <ParkingSpot> availableSpots;
List <ParkingSpot> busySpots;
List<Integer> tickets
}
I know there are more objects than their needs to be, but it for easier understanding.
- Chanicua October 01, 2014