Питання про співбесіду Amazon: Проектування паркувальних ділянок ОО [закрито]


114

Проектуйте паркувальну станцію OO. Які класи та функції вони матимуть. Слід сказати, повний, порожній, а також зможете знайти місце для паркування автомобіля Valet. На ділянці є 3 різні види паркування: регулярне, інвалідне та компактне.

Дякую!


39
Ви стрибали і вигукували "що це стосується книг?" і штурмувати?
JP Alioto

Мене попросив хлопець, який перейшов до іншої ситуації. Коли я належним чином використав малюнок підручника «Банда з чотирьох», він сказав: «Принаймні, ви знаєте поліморфізм». Тоді мені подякували за приїзд і сказали, що вони мені дадуть знати. Я не був вражений.
Девід Торнлі

Це не проблема управління пам’яттю?
Саньєєв Кумар Дангі

1
Задавши це запитання, чи потрібно було насправді виписувати класи та функції на CollabEdit чи вам просто довелося про них говорити?
committedandroider

Погляньте на це. github.com/shanshaji/parking-lot , сподіваюся, що це допоможе
Шань

Відповіді:


159

Ось швидкий старт, щоб передачі поверталися ...

ParkingLot - клас.

ParkingSpace - клас.

ParkingSpace має вхід.

Вхід має місце розташування або, точніше, відстань від Входу.

ParkingLotSign - клас.

У ParkingLot є ParkingLotSign.

ParkingLot має обмежену кількість ParkingSpaces.

HandicappedParkingSpace - це підклас ParkingSpace.

RegularParkingSpace - це підклас ParkingSpace.

CompactParkingSpace - це підклас ParkingSpace.

ParkingLot зберігає масив ParkingSpaces та окремий масив вільних ParkingSpaces у порядку відстані від його входу.

ParkingLotSign може бути запропоновано відображати "повний", "порожній" або "порожній / нормальний / частково зайнятий", зателефонувавши. Full (), .Empty () або .Normal ()

Паркер - клас.

Паркер може Парк ().

Паркер може відпаркувати ().

Valet - це підклас Parker, який може викликати ParkingLot.FindVacantSpaceNearestEntrance (), який повертає ParkingSpace.

У Parker є ParkingSpace.

Паркер може зателефонувати ParkingSpace.Take () та ParkingSpace.Vacate ().

Паркер дзвонить Entrance.Entering () і Entrance.Exiting () і ParkingSpace повідомляє ParkingLot про його взяття або звільнення, щоб ParkingLot міг визначити, заповнений він чи ні. Якщо він нещодавно повний або нещодавно порожній або нещодавно не повний або порожній, він повинен змінити ParkingLotSign.Full () або ParkingLotSign.Empty () або ParkingLotSign.Normal ().

HandicappedParker може бути підкласом Parker, а CompactParker - підкласом Parker, а RegularParker - підкласом Parker. (можливо, надмірне вбивство.)

У цьому рішенні можливо, що Паркер повинен бути перейменований на Автомобіль.


32
Не забудьте машину.
ojblass

5
Чому ParkingSpace повинен бути класом? Я не бачу необхідності створювати для цього об’єкт? У будь-який час будь-яке місце для паркування повинно бути обмеженим, регулярним або компактним. ParkingSpace повинен бути швидше інтерфейсом.
name_masked

11
Можливо, ми можемо додати підлоги до парковки ..
Barry

13
Чому існує клас ParkingLotSign? Чи не працюватиме атрибут (скажімо, bool isFull;)?
Chinmay Nerurkar

3
Чому зробити місце для паркування розтяжним? Чому б просто не встановити поле heHicaicapped і поле isCompact до місця стоянки?
відданийандройдер

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,
}

6
Використовуйте HashMap замість списків з номером транспортного засобу як ключовим для ефективності
sanath_p

5
Після випускуVehicle vacantParkingSpacesбільше не сортується. Ви повинні сортувати його так, щоб findNearestVacantповертати найближче місце для паркування.
laike9m

1
Чому функція називається findNearestVacant, коли її реалізація знаходить лише вільний простір, не обов'язково "найближчий"? Чому б не "findVacant"? Хоча було б добре повернути "найближчий" простір, використовуючи деякі стани, що зберігаються в класі. Можливо, ми можемо зберігати відстані від «входу» та «виходу» в класі «простір», щоб можна було також обчислити «найближчий», або просто просто координати простору, так що відстані від усіх входів і виходи можуть бути обчислені за потребою.
Наваз

1
Також функція parkVehicleповинна повертати булеве значення, що вказує, був автомобіль припаркований чи ні.
Наваз

Ніяких перевірок.
Викине

10

Моделі не існують ізольовано. Структури, які ви б визначили для моделювання автомобілів, що в’їжджають на автостоянку, вбудована система, яка спрямовує вас на вільний простір, систему виставлення рахунків на парковку автомобіля або на автоматизовані ворота / машини для продажу квитків, звичайні на автостоянках, всі різні.


6

На об'єктно-орієнтованій парковці супроводжувачів не буде потреби, оскільки машини будуть «вміти паркувати».

Знайти корисну машину на партії буде складно; найпоширеніші моделі або матимуть, щоб всі їх рухомі частини були викритими як публічні змінні, або вони будуть "повністю капсульовані" машини без вікон і дверей.

Місце для паркування на нашому парковці OO не буде відповідати розмірам та формі автомобілів ("невідповідність невідповідності" між місцями та автомобілями)

Мітки ліцензій на нашому лоті матимуть крапку між кожною літерою та цифрою. Паркування для інвалідів буде доступне лише для ліцензій, що починаються з "_", а ліцензії, що починаються з "m_", буксируються.


5

вам знадобиться стоянка, яка містить багатовимірний масив (вказаний у конструкторі) типу "пробіл". На стоянці можна відстежувати, скільки місця було зайнято за допомогою дзвінків до функцій, які заповнюють та порожні місця. У просторі може бути перелічений тип, який повідомляє, який це простір. Простір також має метод, прийнятий (). Для паркування автомобіля, просто знайдіть перше місце, яке відкриється, і поставте машину туди. Вам також знадобиться автомобільний об’єкт, щоб розмістити його в просторі, який вміщує, чи є це інваліди, компактні або звичайні транспортні засоби.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.