Amazon Interview Question for SDE1s


Team: Advertising
Country: United States
Interview Type: In-Person




Comment hidden because of low score. Click to expand.
3
of 3 vote

I know there are more objects than their needs to be, but it for easier understanding.

class Ticket {
        public string PersonName;
        public string TicketID;
    }

    class ValetParking
    {
        private Dictionary<Ticket, Spot> ticketRemainder = new Dictionary<Ticket, Spot>();

        private List<Spot> smallSpots = new List<Spot>();
        private List<Spot> mediumSpots = new List<Spot>();
        private List<Spot> bigSpots = new List<Spot>();

        public ValetParking(int small, int medium, int big) 
        {
            CreateSpots(small, VehicleSize.Small);
            CreateSpots(medium, VehicleSize.Medium);
            CreateSpots(big, VehicleSize.Big);
        }

        private void CreateSpots(int total, VehicleSize type) {
            List<Spot> list = null;

            switch (type) 
            {
                case VehicleSize.Small:
                    {
                        list = smallSpots; break;
                    }
                case VehicleSize.Medium:
                    {
                        list = mediumSpots; break;
                    }
                case VehicleSize.Big:
                    {
                        list = bigSpots; break;
                    }
            }

            for (int i = 0; i < total; i++)
            {
                list.Add(new Spot(type));
            }
        }

        private Spot FindSpot(Vehicle v) 
        {
            if (v == null) return null;

            List<List<Spot>> spotsToSearch = new List<List<Spot>>();

            spotsToSearch.Add(smallSpots);

            if (v.Size == VehicleSize.Medium || v.Size == VehicleSize.Big) {
                spotsToSearch.Add(mediumSpots);
            }
            if (v.Size == VehicleSize.Big)
            {
                spotsToSearch.Add(bigSpots);
            }

            foreach (List<Spot> parking in spotsToSearch) 
            {
                foreach (Spot s in parking)
                {
                    if (!s.IsEmpty) 
                    {
                        return s;
                    }
                }
            }

            return null;
        }

        public Ticket Park(Vehicle v, string personName) {

            Spot s = FindSpot(v);

            if (s != null) {
                s.Park(v);
                Ticket t = new Ticket() { PersonName = personName, TicketID = "Ticket ID : " + s.GetHashCode() };

                ticketRemainder.Add(t, s);

                return t;
            }

            return null;
        } 

        public Vehicle Unpark(Ticket ticket) {
            if (ticket != null && ticketRemainder.ContainsKey(ticket)) {
                Spot s = ticketRemainder[ticket];
                return s.Unpark();
            }

            return null;
        }
    }

    public enum VehicleSize { Small, Medium, Big }

    class Vehicle 
    {
        private VehicleSize size = VehicleSize.Small;
        public VehicleSize Size 
        {
            get { return size; }
        }
    }

    class Spot {
        private VehicleSize size = VehicleSize.Small;
        public VehicleSize Size
        {
            get { return size; }
        }

        public Spot(VehicleSize vs) {
            size = vs;
        }

        private Vehicle ParkedVehicle { get; set; }

        public void Park(Vehicle v) 
        {
            if (IsEmpty)
            {
                ParkedVehicle = v;
            }
        }

        public Vehicle Unpark() {
            if (!IsEmpty) {
                Vehicle v = ParkedVehicle;
                ParkedVehicle = null;

                return v;
            }

            return null;
        }

        public bool IsEmpty 
        {
            get { return ParkedVehicle == null; }
        }
    }

- Chanicua October 01, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

would we ever get this much time in an interview ?

- coolraj334 December 03, 2014 | Flag
Comment hidden because of low score. Click to expand.
1
of 1 vote

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...

- trythis November 08, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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.

- Johnson October 09, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

stackoverflow.com/questions/764933/amazon-interview-question-design-an-oo-parking-lot

- sl714 October 25, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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);
         }
      }

- pshibusalam November 12, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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
	}

- lokesh.vashisata December 13, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
-1
of 1 vote

public interface VehicalType{
public String getType();
}

- Anonymous September 26, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
-1
of 1 vote

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

}

- Anonymous September 26, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
1
of 1 vote

A ticket should identify one of the parkingspot. you need mapping for that as well. when a car is parked on a spot, ticket for that spot needs to be returned to user.
and vice a versa when ticket is returned, car from that parking spot needs to be unparked.

- anon September 27, 2014 | Flag
Comment hidden because of low score. Click to expand.


Add a Comment
Name:

Writing Code? Surround your code with {{{ and }}} to preserve whitespace.

Books

is a comprehensive book on getting a job at a top tech company, while focuses on dev interviews and does this for PMs.

Learn More

Videos

CareerCup's interview videos give you a real-life look at technical interviews. In these unscripted videos, watch how other candidates handle tough questions and how the interviewer thinks about their performance.

Learn More

Resume Review

Most engineers make critical mistakes on their resumes -- we can fix your resume with our custom resume review service. And, we use fellow engineers as our resume reviewers, so you can be sure that we "get" what you're saying.

Learn More

Mock Interviews

Our Mock Interviews will be conducted "in character" just like a real interview, and can focus on whatever topics you want. All our interviewers have worked for Microsoft, Google or Amazon, you know you'll get a true-to-life experience.

Learn More