Câu hỏi phỏng vấn Amazon: Thiết kế một bãi đậu xe OO [đã đóng cửa]


114

Thiết kế một bãi đậu xe OO. Nó sẽ có những lớp và chức năng nào. Nó sẽ nói, đầy đủ, trống rỗng và cũng có thể tìm thấy chỗ đậu xe cho người phục vụ. Lô có 3 hình thức đậu khác nhau: thông thường, khuyết tật và nhỏ gọn.

Cảm ơn!


39
Bạn đã nhảy lên và thốt lên "điều này có liên quan gì đến sách?" và xông ra ngoài?
JP Alioto

Tôi đã hỏi điều đó bởi một chàng trai đã đi đến một tình huống khác. Khi tôi sử dụng mẫu Gang of Four gần như sách giáo khoa một cách thích hợp, anh ấy nói "Ít nhất thì bạn cũng biết tính đa hình." Sau đó tôi được cảm ơn vì đã đến và nói rằng họ sẽ cho tôi biết. Tôi không ấn tượng.
David Thornley

Đây không phải là vấn đề quản lý bộ nhớ?
Sanjeev Kumar Dangi

1
Khi được hỏi câu hỏi này, bạn thực sự phải viết ra các lớp và hàm trên CollabEdit hay bạn chỉ cần nói về chúng?
committedandroider

Hãy xem nó. github.com/shanshaji/parking-lot , hy vọng nó sẽ hữu ích
Shan

Câu trả lời:


159

Đây là cách bắt đầu nhanh để chuyển bánh răng ...

ParkingLot là một lớp.

ParkingSpace là một lớp.

Bãi đậu xe có một Lối vào.

Entrance có vị trí hay cụ thể hơn là khoảng cách với Entrance.

ParkingLotSign là một lớp.

ParkingLot có một ParkingLotSign.

ParkingLot có số lượng ParkingSpaces hữu hạn.

HandicappedParkingSpace là một lớp con của ParkingSpace.

RegularParkingSpace là một lớp con của ParkingSpace.

CompactParkingSpace là một lớp con của ParkingSpace.

ParkingLot giữ một loạt các Bãi đậu xe, và một mảng Bãi đậu xe trống riêng biệt theo thứ tự khoảng cách từ Lối vào của nó.

ParkingLotSign có thể được yêu cầu hiển thị "đầy đủ", hoặc "trống", hoặc "trống / bình thường / bị chiếm một phần" bằng cách gọi .Full (), .Empty () hoặc .Normal ()

Parker là một đẳng cấp.

Parker có thể Park ().

Parker có thể Unpark ().

Valet là một lớp con của Parker có thể gọi ParkingLot.FindVacantSpaceNearestEntrance (), trả về một ParkingSpace.

Parker có một Bãi đậu xe.

Parker có thể gọi ParkingSpace.Take () và ParkingSpace.Vacate ().

Parker gọi Entrance.Entering () và Entrance.Exiting () và ParkingSpace thông báo cho ParkingLot khi nó được lấy hoặc bỏ trống để ParkingLot có thể xác định xem nó đã đầy hay chưa. Nếu nó mới đầy hoặc mới trống hoặc mới không đầy hoặc trống, nó nên thay đổi ParkingLotSign.Full () hoặc ParkingLotSign.Empty () hoặc ParkingLotSign.Normal ().

HandicappedParker có thể là một lớp con của Parker và CompactParker là một lớp con của Parker và RegularParker là một lớp con của Parker. (thực ra có thể là quá mức cần thiết.)

Trong giải pháp này, có thể Parker nên được đổi tên thành Car.


32
Xin đừng quên xe hơi.
ojblass

5
Tại sao ParkingSpace phải là một lớp? Tôi không thấy cần tạo đối tượng cho nó? Tại mọi thời điểm, bất kỳ chỗ đậu xe nào cũng phải là Chỗ dành cho Người khuyết tật, Thông thường hoặc Nhỏ gọn. ParkingSpace nên là một giao diện.
name_masked

11
Có lẽ chúng ta có thể thêm tầng vào bãi đậu xe ..
Barry

13
Tại sao lớp ParkingLotSign tồn tại? Một thuộc tính (giả sử, bool isFull;) sẽ không hoạt động?
Chinmay Nerurkar

3
Tại sao lại mở rộng điểm đỗ xe? Tại sao không chỉ có trường isHandicapped và trường isCompact vào điểm đỗ xe?
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,
}

6
Sử dụng HashMap thay vì danh sách với số lượng xe như chìa khóa cho hiệu quả
sanath_p

5
Sau khi bạn phát hànhVehicle, vacantParkingSpaceskhông được sắp xếp nữa. Bạn phải sắp xếp nó để findNearestVacanttrả lại chỗ đậu xe gần nhất.
laike9m

1
Tại sao hàm được đặt tên findNearestVacant, khi việc triển khai nó chỉ tìm thấy một khoảng trống, không nhất thiết là "gần nhất"? Tại sao không phải là "findVacant"? Mặc dù sẽ rất tốt nếu trả về không gian "gần nhất" bằng cách sử dụng một số trạng thái được lưu trữ trong lớp. Có thể, chúng ta có thể lưu trữ khoảng cách từ "lối vào" và "lối ra" trong lớp "không gian" để cũng có thể tính được "gần nhất" Hoặc chúng ta có thể đơn giản là tọa độ của không gian, để khoảng cách từ tất cả các lối vào và các lối thoát có thể được tính toán khi cần thiết.
Nawaz

1
Ngoài ra, hàm parkVehiclesẽ trả về một giá trị boolean cho biết phương tiện đã được đậu hay chưa.
Nawaz

Không có séc nào. Sẽ ném NPE
hitesh

10

Mô hình không tồn tại biệt lập. Các cấu trúc bạn sẽ xác định để mô phỏng ô tô vào bãi đỗ xe, hệ thống nhúng hướng dẫn bạn đến chỗ trống, hệ thống tính tiền đỗ xe hoặc cho cổng / máy soát vé tự động thường thấy ở các bãi đỗ xe đều khác nhau.


6

Trong một bãi đậu xe Hướng Đối tượng, sẽ không cần tiếp viên vì những chiếc xe sẽ "biết cách đậu".

Tìm một chiếc xe còn sử dụng được trên lô đất sẽ rất khó; các mô hình phổ biến nhất sẽ có tất cả các bộ phận chuyển động của chúng được phơi bày dưới dạng các biến thành viên công khai, hoặc chúng sẽ là những chiếc xe "được gói gọn" không có cửa sổ hoặc cửa ra vào.

Chỗ đậu xe trong bãi đậu xe OO của chúng tôi sẽ không phù hợp với kích thước và hình dạng của ô tô ("sự không tương xứng" giữa chỗ và ô tô)

Thẻ giấy phép trên lô của chúng tôi sẽ có một dấu chấm giữa mỗi chữ cái và chữ số. Bãi đậu xe dành cho người khuyết tật sẽ chỉ có sẵn cho các giấy phép bắt đầu bằng "_" và các giấy phép bắt đầu bằng "m_" sẽ được kéo.


5

bạn sẽ cần một bãi đậu xe, chứa một mảng đa chiều (được chỉ định trong phương thức khởi tạo) kiểu "khoảng trắng". Bãi đậu xe có thể theo dõi bao nhiêu chỗ trống được sử dụng thông qua các lệnh gọi đến các hàm lấp đầy và chỗ trống. Không gian cũng có một phương thức là (). đối với bãi đậu xe có người phục vụ, chỉ cần tìm khoảng trống đầu tiên mở ra và đặt xe ở đó. Bạn cũng sẽ cần một đối tượng Xe hơi để đặt trong không gian, có thể giữ cho dù đó là phương tiện khuyết tật, nhỏ gọn hay thông thường.


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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.