Amazon Interview Frage: Entwerfen Sie einen OO-Parkplatz [geschlossen]

114

Entwerfen Sie einen OO-Parkplatz. Welche Klassen und Funktionen wird es haben. Es sollte voll, leer sein und auch Platz für den Parkservice finden. Das Grundstück verfügt über 3 verschiedene Arten von Parkplätzen: reguläre, behinderte und kompakte.

Vielen Dank!

verbrannt1ce
quelle
39
Sind Sie aufgesprungen und haben ausgerufen: "Was hat das mit Büchern zu tun?" und stürmen?
JP Alioto
Das wurde ich von einem Mann gefragt, der in eine andere Situation geriet. Als ich ein fast lehrbuchartiges Gang of Four-Muster passend verwendete, sagte er: "Zumindest kennen Sie Polymorphismus." Dann wurde mir für mein Kommen gedankt und sie sagten, sie würden es mich wissen lassen. Ich war nicht beeindruckt.
David Thornley
Ist das nicht ein Problem mit der Speicherverwaltung?
Sanjeev Kumar Dangi
1
Mussten Sie bei dieser Frage tatsächlich die Klassen und Funktionen auf CollabEdit aufschreiben oder mussten Sie nur darüber sprechen?
committedandroider
Schau es dir an. github.com/shanshaji/parking-lot , hoffe es hilft
Shan

Antworten:

159

Hier ist ein schneller Start, um die Gänge zum Laufen zu bringen ...

ParkingLot ist eine Klasse.

ParkingSpace ist eine Klasse.

ParkingSpace hat einen Eingang.

Der Eingang hat einen Ort oder genauer gesagt eine Entfernung vom Eingang.

ParkingLotSign ist eine Klasse.

ParkingLot hat ein ParkingLotSign.

ParkingLot hat eine begrenzte Anzahl von Parkplätzen.

HandicappedParkingSpace ist eine Unterklasse von ParkingSpace.

RegularParkingSpace ist eine Unterklasse von ParkingSpace.

CompactParkingSpace ist eine Unterklasse von ParkingSpace.

ParkingLot verwaltet eine Reihe von Parkplätzen und eine separate Reihe von freien Parkplätzen in der Reihenfolge der Entfernung vom Eingang.

ParkingLotSign kann durch Aufrufen von .Full (), .Empty () oder .Normal () angewiesen werden, "voll" oder "leer" oder "leer / normal / teilweise belegt" anzuzeigen.

Parker ist eine Klasse.

Parker kann parken ().

Parker kann () entparken.

Valet ist eine Unterklasse von Parker, die ParkingLot.FindVacantSpaceNearestEntrance () aufrufen kann und einen ParkingSpace zurückgibt.

Parker hat einen Parkplatz.

Parker kann ParkingSpace.Take () und ParkingSpace.Vacate () aufrufen.

Parker ruft Entrance.Entering () und Entrance.Exiting () auf und ParkingSpace benachrichtigt ParkingLot, wenn es genommen oder geräumt wird, damit ParkingLot feststellen kann, ob es voll ist oder nicht. Wenn es neu voll oder neu leer oder neu nicht voll oder leer ist, sollte es ParkingLotSign.Full () oder ParkingLotSign.Empty () oder ParkingLotSign.Normal () ändern.

HandicappedParker kann eine Unterklasse von Parker und CompactParker eine Unterklasse von Parker und RegularParker eine Unterklasse von Parker sein. (Könnte tatsächlich übertrieben sein.)

In dieser Lösung ist es möglich, dass Parker in Auto umbenannt wird.

Chris Morley
quelle
32
Bitte Auto nicht vergessen.
Ojblass
5
Warum muss ParkingSpace eine Klasse sein? Ich sehe keine Notwendigkeit, ein Objekt dafür zu erstellen? Jeder Parkplatz muss jederzeit behindertengerecht, normal oder kompakt sein. ParkingSpace sollte eher eine Schnittstelle sein.
name_masked
11
Wahrscheinlich können wir dem Parkplatz Stockwerke hinzufügen.
Barry
13
Warum gibt es die ParkingLotSign-Klasse? Würde ein Attribut (z. B. bool isFull;) nicht funktionieren?
Chinmay Nerurkar
3
Warum den Parkplatz erweiterbar machen? Warum nicht einfach ein isHandicapped-Feld und ein isCompact-Feld zum Parkplatz haben?
committedandroider
67
public class ParkingLot 
{
    Vector<ParkingSpace> vacantParkingSpaces = null;
    Vector<ParkingSpace> fullParkingSpaces = null;

    int parkingSpaceCount = 0;

    boolean isFull;
    boolean isEmpty;

    ParkingSpace findNearestVacant(ParkingType type)
    {
        Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator();

        while(itr.hasNext())
        {
            ParkingSpace parkingSpace = itr.next();

            if(parkingSpace.parkingType == type)
            {
                return parkingSpace;
            }
        }
        return null;
    }

    void parkVehicle(ParkingType type, Vehicle vehicle)
    {
        if(!isFull())
        {
            ParkingSpace parkingSpace = findNearestVacant(type);

            if(parkingSpace != null)
            {
                parkingSpace.vehicle = vehicle;
                parkingSpace.isVacant = false;

                vacantParkingSpaces.remove(parkingSpace);
                fullParkingSpaces.add(parkingSpace);

                if(fullParkingSpaces.size() == parkingSpaceCount)
                    isFull = true;

                isEmpty = false;
            }
        }
    }

    void releaseVehicle(Vehicle vehicle)
    {
        if(!isEmpty())
        {
            Iterator<ParkingSpace> itr = fullParkingSpaces.iterator();

            while(itr.hasNext())
            {
                ParkingSpace parkingSpace = itr.next();

                if(parkingSpace.vehicle.equals(vehicle))
                {
                    fullParkingSpaces.remove(parkingSpace);
                    vacantParkingSpaces.add(parkingSpace);

                    parkingSpace.isVacant = true;
                    parkingSpace.vehicle = null;

                    if(vacantParkingSpaces.size() == parkingSpaceCount)
                        isEmpty = true;

                    isFull = false;
                }
            }
        }
    }

    boolean isFull()
    {
        return isFull;
    }

    boolean isEmpty()
    {
        return isEmpty;
    }
}

public class ParkingSpace 
{
    boolean isVacant;
    Vehicle vehicle;
    ParkingType parkingType;
    int distance;
}

public class Vehicle 
{
    int num;
}

public enum ParkingType
{
    REGULAR,
    HANDICAPPED,
    COMPACT,
    MAX_PARKING_TYPE,
}
Srikant Aggarwal
quelle
6
Verwenden Sie HashMap anstelle von Listen mit der Fahrzeugnummer als Schlüssel für die Effizienz
sanath_p
5
Nachdem Sie das Fahrzeug freigegeben haben, vacantParkingSpaceswird es nicht mehr sortiert. Sie müssen es so sortieren, dass findNearestVacantder nächste Parkplatz zurückgegeben wird.
Laike9m
1
Warum wird die Funktion benannt findNearestVacant, wenn ihre Implementierung nur einen freien Raum findet, nicht unbedingt den "nächsten"? Warum nicht "findVacant"? Obwohl es gut gewesen wäre, den "nächsten" Raum unter Verwendung einiger in der Klasse gespeicherter Zustände zurückzugeben. Vielleicht können wir die Abstände vom "Eingang" und "Ausgang" in der Klasse "Raum" speichern, damit auch "am nächsten" berechnet werden kann, oder wir können einfach die Koordinaten des Raums, so dass die Abstände von allen Eingängen und Ausgänge können bei Bedarf berechnet werden.
Nawaz
1
Außerdem sollte die Funktion parkVehicleeinen booleschen Wert zurückgeben, der angibt, ob das Fahrzeug geparkt wurde oder nicht.
Nawaz
Keine Nullprüfungen. Wird NPE werfen
Hitesh
10

Modelle existieren nicht isoliert. Die Strukturen, die Sie für eine Simulation von Autos definieren würden, die auf einen Parkplatz fahren, ein eingebettetes System, das Sie zu einem freien Platz führt, ein Parkabrechnungssystem oder für die auf Parkplätzen üblichen automatisierten Tore / Fahrkartenautomaten sind alle unterschiedlich.

Pete Kirkham
quelle
6

Auf einem objektorientierten Parkplatz werden keine Begleiter benötigt, da die Autos "wissen, wie man parkt".

Es wird schwierig sein, ein brauchbares Auto auf dem Grundstück zu finden. Bei den gängigsten Modellen werden entweder alle beweglichen Teile als Variablen für öffentliche Mitglieder angezeigt, oder es handelt sich um "vollständig gekapselte" Autos ohne Fenster oder Türen.

Die Parkplätze auf unserem OO-Parkplatz entsprechen nicht der Größe und Form der Autos (eine "Impedanzfehlanpassung" zwischen den Parkplätzen und den Autos).

Lizenzetiketten auf unserem Los haben einen Punkt zwischen jedem Buchstaben und jeder Ziffer. Behindertenparkplätze sind nur für Lizenzen verfügbar, die mit "_" beginnen, und Lizenzen, die mit "m_" beginnen, werden abgeschleppt.

Paul Keister
quelle
5

Sie benötigen einen Parkplatz, der ein mehrdimensionales Array (im Konstruktor angegeben) vom Typ "Leerzeichen" enthält. Der Parkplatz kann verfolgen, wie viele Plätze durch Aufrufe von Funktionen belegt werden, die Räume füllen und leeren. Der Platz kann einen Aufzählungstyp enthalten, der angibt, um welche Art von Platz es sich handelt. Space hat auch eine Methode genommen (). Suchen Sie für den Parkservice einfach den ersten offenen Platz und stellen Sie das Auto dort ab. Sie benötigen auch ein Autoobjekt, um es in den Raum zu stellen, das hält, ob es sich um ein behindertes, kompaktes oder normales Fahrzeug handelt.


class ParkingLot
{
    Space[][] spaces;

    ParkingLot(wide, long); // constructor

    FindOpenSpace(TypeOfCar); // find first open space where type matches
}

enum TypeOfSpace = {compact, handicapped, regular };
enum TypeOfCar = {compact, handicapped, regular };

class Space
{
    TypeOfSpace type;
    bool empty;
    // gets and sets here
    // make sure car type
}

class car
{
    TypeOfCar type;
}

Scott M.
quelle