Pertanyaan Wawancara Amazon: Mendesain tempat parkir OO [ditutup]


114

Rancang tempat parkir OO. Kelas dan fungsi apa yang akan dimilikinya. Seharusnya tertulis, penuh, kosong dan juga dapat menemukan tempat untuk parkir Valet. Tempat parkir memiliki 3 jenis tempat parkir: biasa, cacat, dan kompak.

Terima kasih!


39
Apakah Anda melompat dan berseru, "apa hubungannya ini dengan buku?" dan keluar?
JP Alioto

Saya ditanyai itu oleh seorang pria yang melanjutkan ke situasi lain. Ketika saya menggunakan pola buku teks Gang of Four dengan tepat, dia berkata, "Setidaknya Anda tahu polimorfisme." Saya kemudian berterima kasih karena telah datang, dan diberi tahu bahwa mereka akan memberi tahu saya. Saya tidak terkesan.
David Thornley

Bukankah ini masalah manajemen memori?
Sanjeev Kumar Dangi

1
Ketika ditanya pertanyaan ini, apakah Anda benar-benar harus menulis kelas dan fungsi di CollabEdit atau Anda hanya perlu membicarakannya?
berkomitmen

Coba lihat itu. github.com/shanshaji/parking-lot , semoga membantu
Shan

Jawaban:


159

Ini adalah awal yang cepat untuk membuat roda gigi berputar ...

ParkingLot adalah sebuah kelas.

ParkingSpace adalah sebuah kelas.

ParkingSpace memiliki Pintu Masuk.

Pintu masuk memiliki lokasi atau lebih tepatnya, jarak dari Pintu Masuk.

ParkingLotSign adalah sebuah kelas.

ParkingLot memiliki ParkingLotSign.

ParkingLot memiliki jumlah ParkingSpaces yang terbatas.

HandicappedParkingSpace adalah subclass dari ParkingSpace.

RegularParkingSpace adalah subclass dari ParkingSpace.

CompactParkingSpace adalah subclass dari ParkingSpace.

ParkingLot menyimpan berbagai ParkingSpaces, dan berbagai ParkingSpaces kosong yang terpisah dalam urutan jarak dari Pintu Masuknya.

ParkingLotSign dapat diberi tahu untuk menampilkan "penuh", atau "kosong", atau "kosong / normal / sebagian terisi" dengan memanggil .Full (), .Empty () atau .Normal ()

Parker adalah sebuah kelas.

Parker dapat Park ().

Parker dapat Unpark ().

Valet adalah subclass dari Parker yang dapat memanggil ParkingLot.FindVacantSpaceNearestEntrance (), yang mengembalikan ParkingSpace.

Parker memiliki ParkingSpace.

Parker dapat memanggil ParkingSpace.Take () dan ParkingSpace.Vacate ().

Parker memanggil Entrance.Entering () dan Entrance.Exiting () dan ParkingSpace memberi tahu ParkingLot saat diambil atau dikosongkan sehingga ParkingLot dapat menentukan apakah sudah penuh atau tidak. Jika baru penuh atau baru kosong atau baru tidak penuh atau kosong, ini harus mengubah ParkingLotSign.Full () atau ParkingLotSign.Empty () atau ParkingLotSign.Normal ().

HandicappedParker adalah subkelas dari Parker dan CompactParker merupakan subkelas dari Parker dan RegularParker merupakan subkelas dari Parker. (mungkin berlebihan, sebenarnya.)

Dalam solusi ini, ada kemungkinan Parker harus diganti namanya menjadi Mobil.


32
Tolong jangan lupakan mobil.
ojblass

5
Mengapa ParkingSpace harus menjadi kelas? Saya tidak melihat ada kebutuhan untuk membuat objek untuk itu? Setiap saat, setiap tempat parkir harus dalam bentuk Handicapped, Regular atau Compact. ParkingSpace seharusnya menjadi antarmuka.
name_masked

11
Mungkin kita bisa menambahkan lantai ke tempat parkir ..
Barry

13
Mengapa kelas ParkingLotSign ada? Bukankah sebuah atribut (katakanlah, bool isFull;) berfungsi?
Chinmay Nerurkar

3
Mengapa membuat tempat parkir bisa diperluas? Mengapa tidak hanya memiliki bidang isHandicapped dan isCompact bidang ke tempat parkir?
berkomitmen

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
Gunakan HashMap alih-alih daftar dengan nomor kendaraan sebagai kunci efisiensi
sanath_p

5
Setelah Anda melepaskanVehicle, vacantParkingSpacestidak diurutkan lagi. Anda harus membuatnya disortir sehingga findNearestVacantmengembalikan tempat parkir terdekat.
laike9m

1
Mengapa fungsi ini dinamai findNearestVacant, jika implementasinya hanya menemukan ruang kosong, bukan yang "terdekat"? Mengapa tidak "findVacant"? Meskipun akan lebih baik untuk mengembalikan ruang "terdekat", menggunakan beberapa status yang disimpan di kelas. Mungkin, kita dapat menyimpan jarak dari "pintu masuk" dan "keluar" di kelas "ruang" sehingga "terdekat" dapat dihitung juga. Atau kita dapat dengan mudah mengetahui koordinat ruang, sehingga jarak dari semua pintu masuk dan keluar dapat dihitung sesuai kebutuhan.
Nawaz

1
Selain itu, fungsi tersebut parkVehicleharus mengembalikan nilai boolean yang menunjukkan apakah kendaraan diparkir atau tidak.
Nawaz

Tidak ada pemeriksaan nol. Akan membuang NPE
hitesh

10

Model tidak ada secara terpisah. Struktur yang Anda tetapkan untuk simulasi mobil yang memasuki tempat parkir, sistem tertanam yang memandu Anda ke ruang kosong, sistem penagihan parkir mobil, atau untuk gerbang / mesin tiket otomatis yang biasa ada di tempat parkir, semuanya berbeda.


6

Di tempat parkir Berorientasi Objek, tidak diperlukan petugas karena mobil akan "tahu cara parkir".

Menemukan mobil yang dapat digunakan di tempat parkir akan sulit; model yang paling umum akan menampilkan semua bagiannya yang bergerak sebagai variabel anggota publik, atau mereka akan menjadi mobil "terenkapsulasi penuh" tanpa jendela atau pintu.

Ruang parkir di tempat parkir OO kami tidak akan sesuai dengan ukuran dan bentuk mobil ("ketidaksesuaian impedansi" antara ruang dan mobil)

Label lisensi di lot kami memiliki titik di antara setiap huruf dan digit. Parkir khusus penyandang cacat hanya akan tersedia untuk izin yang diawali dengan "_", dan izin yang diawali dengan "m_" akan ditarik.


5

Anda akan membutuhkan tempat parkir, yang menampung larik multi-dimensi (ditentukan dalam konstruktor) dengan tipe "ruang". Tempat parkir dapat melacak berapa banyak ruang yang diambil melalui panggilan ke fungsi yang mengisi dan mengosongkan ruang. Ruang dapat menampung jenis enumerasi yang memberi tahu jenis ruang itu. Ruang juga memiliki metode yang diambil (). untuk parkir valet, cari saja ruang pertama yang terbuka dan letakkan mobil di sana. Anda juga akan membutuhkan benda Mobil untuk diletakkan di ruang, yang menampung apakah itu kendaraan cacat, kompak, atau biasa.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.