Pytanie do wywiadu z Amazon: Zaprojektuj parking OO [zamknięte]

114

Zaprojektuj parking OO. Jakie klasy i funkcje będzie miał. Powinien powiedzieć, pełny, pusty, a także być w stanie znaleźć miejsce do parkowania przez obsługę. Na działce znajdują się 3 różne rodzaje parkingów: zwykły, dla niepełnosprawnych i kompaktowy.

Dzięki!

spalony
źródło
39
Czy podskoczyłeś i zawołałeś „co to ma wspólnego z książkami?” i wybiec?
JP Alioto
Zapytał mnie o to facet, który przeszedł do innej sytuacji. Kiedy odpowiednio użyłem prawie podręcznikowego wzorca Gang of Four, powiedział: „Przynajmniej znasz polimorfizm”. Następnie podziękowano mi za przybycie i powiedziano mi, że dadzą mi znać. Nie byłem pod wrażeniem.
David Thornley
Czy to nie jest problem z zarządzaniem pamięcią?
Sanjeev Kumar Dangi
1
Kiedy zadano Ci to pytanie, czy faktycznie musiałeś napisać klasy i funkcje w CollabEdit, czy po prostu musiałeś o nich porozmawiać?
popełnionyandroider
Spójrz na to. github.com/shanshaji/parking-lot , mam nadzieję, że to pomoże
Shan

Odpowiedzi:

159

Oto szybki początek, aby włączyć biegi ...

ParkingLot to klasa.

ParkingSpace to klasa.

ParkingSpace ma wejście.

Wejście ma lokalizację, a dokładniej odległość od wejścia.

ParkingLotSign to klasa.

ParkingLot ma ParkingLotSign.

ParkingLot ma ograniczoną liczbę miejsc parkingowych.

HandicappedParkingSpace jest podklasą obiektu ParkingSpace.

RegularParkingSpace jest podklasą ParkingSpace.

CompactParkingSpace jest podklasą ParkingSpace.

ParkingLot przechowuje tablicę miejsc parkingowych i oddzielną tablicę wolnych miejsc parkingowych w kolejności odległości od wejścia.

ParkingLotSign można nakazać, aby wyświetlał „pełny”, „pusty” lub „pusty / normalny / częściowo zajęty”, wywołując funkcję .Full (), .Empty () lub .Normal ()

Parker to klasa.

Parker może parkować ().

Parker może odparkować ().

Valet jest podklasą Parkera, która może wywołać ParkingLot.FindVacantSpaceNearestEntrance (), która zwraca ParkingSpace.

Parker ma parking.

Parker może wywołać ParkingSpace.Take () i ParkingSpace.Vacate ().

Parker wywołuje Entrance.Entering () i Entrance.Exiting (), a ParkingSpace powiadamia ParkingLot o zajęciu lub zwolnieniu, aby ParkingLot mógł określić, czy jest pełny, czy nie. Jeśli jest nowo zapełniony lub nowo pusty, lub niedawno nie jest pełny lub pusty, powinien zmienić ParkingLotSign.Full () lub ParkingLotSign.Empty () lub ParkingLotSign.Normal ().

HandicappedParker może być podklasą Parker i CompactParker podklasą Parker i RegularParker podklasą Parkera. (właściwie może to być przesada.)

W tym rozwiązaniu istnieje możliwość zmiany nazwy Parkera na Car.

Chris Morley
źródło
32
Nie zapomnij samochodu.
ojblass
5
Dlaczego ParkingSpace musi być klasą? Nie widzę potrzeby tworzenia do tego obiektu? Przez cały czas każde miejsce parkingowe musi być niepełnosprawne, normalne lub kompaktowe. ParkingSpace powinien być raczej interfejsem.
name_masked
11
Prawdopodobnie możemy dodać piętra do parkingu ..
Barry
13
Dlaczego istnieje klasa ParkingLotSign? Czy atrybut (powiedzmy, bool isFull;) nie działałby?
Chinmay Nerurkar
3
Po co rozszerzać miejsce parkingowe? Dlaczego nie mieć po prostu pola isHandicapped i isCompact na miejscu parkingowym?
popełnionyandroider
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
źródło
6
Użyj HashMap zamiast list z numerem pojazdu jako kluczem do wydajności
sanath_p
5
Po wydaniu Pojazd vacantParkingSpacesnie jest już sortowany. Musisz zrobić to posortowane, aby zwrócić findNearestVacantnajbliższe miejsce parkingowe.
laike9m
1
Dlaczego nazywa się funkcję findNearestVacant, skoro jej implementacja znajduje tylko wolną przestrzeń, niekoniecznie „najbliższą”? Dlaczego nie „findVacant”? Chociaż dobrze byłoby zwrócić „najbliższą” przestrzeń, używając niektórych stanów przechowywanych w klasie. Być może możemy przechowywać odległości od „wejścia” i „wyjścia” w klasie „przestrzeń”, aby można było również obliczyć „najbliższe” lub po prostu współrzędne przestrzeni, tak aby odległości od wszystkich wejść i wyjścia mogą być obliczane w razie potrzeby.
Nawaz
1
Ponadto funkcja parkVehiclepowinna zwracać wartość logiczną wskazującą, czy pojazd był zaparkowany, czy nie.
Nawaz
Brak czeków zerowych.
Rzuci
10

Modele nie istnieją w izolacji. Struktury, które zdefiniowałbyś dla symulacji samochodów wjeżdżających na parking, wbudowanego systemu, który prowadzi Cię do wolnego miejsca, systemu rozliczeń parkingowych lub automatycznych bramek / biletomatów, które są zwykle używane na parkingach, są różne.

Pete Kirkham
źródło
6

Na parkingu zorientowanym obiektowo nie będzie potrzeby zatrudniania personelu, ponieważ samochody będą „wiedziały, jak zaparkować”.

Znalezienie nadającego się do użytku samochodu na parceli będzie trudne; W najpopularniejszych modelach wszystkie części ruchome będą widoczne jako publiczne zmienne lub będą to samochody „całkowicie zamknięte” bez okien i drzwi.

Miejsca parkingowe na naszym parkingu OO nie będą pasowały do ​​rozmiaru i kształtu samochodów („niedopasowanie impedancji” między miejscami a samochodami)

Etykiety licencyjne na naszym parceli będą miały kropkę między każdą literą a cyfrą. Parking dla niepełnosprawnych będzie dostępny tylko dla licencji rozpoczynających się od „_”, a licencje zaczynające się od „m_” będą holowane.

Paul Keister
źródło
5

potrzebowałbyś parkingu, który zawiera wielowymiarową tablicę (określoną w konstruktorze) typu „spacja”. Parking może śledzić, ile miejsc jest zajętych przez wywołania funkcji, które wypełniają i puste przestrzenie. Przestrzeń może pomieścić wyliczony typ, który mówi, jakiego rodzaju jest to miejsce. Przestrzeń ma również metodę taken (). w przypadku usługi parkingowego, po prostu znajdź pierwsze otwarte miejsce i umieść tam samochód. Będziesz także potrzebował obiektu Car do umieszczenia w przestrzeni, który pomieści bez względu na to, czy jest to pojazd niepełnosprawny, kompaktowy czy zwykły.


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.
źródło