아마존 인터뷰 질문 : OO 주차장 설계 [닫힘]


114

OO 주차장을 설계합니다. 어떤 클래스와 기능을 갖습니다. 꽉 차 있고 비어 있고 발렛 주차 공간도 찾을 수 있어야합니다. 주차장에는 일반, 장애인 및 소형 주차의 3 가지 유형이 있습니다.

감사!


39
당신은 도약하고 "이게 책과 무슨 관련이 있는가?"라고 외쳤습니까? 그리고 스톰 아웃?
JP Alioto

나는 다른 상황을 겪은 남자로부터 그것을 요청 받았다. 내가 거의 교과서 인 Gang of Four 패턴을 적절하게 사용했을 때 그는 "적어도 다형성은 알고있다"고 말했다. 나는와 주셔서 감사하고 그들이 나에게 알려 주겠다고 말했습니다. 나는 인상적이지 않았다.
David Thornley

이 메모리 관리 문제 아닙니까?
Sanjeev Kumar Dangi 2013

1
이 질문을 받았을 때 실제로 CollabEdit에서 클래스와 함수를 작성해야 했습니까? 아니면 그냥 이야기해야 했습니까?
committedandroider

한번보세요. github.com/shanshaji/parking-lot는 , 그것이 도움이되기를 바랍니다

답변:


159

다음은 기어를 돌리는 빠른 시작입니다 ...

ParkingLot는 클래스입니다.

ParkingSpace는 클래스입니다.

ParkingSpace에는 입구가 있습니다.

입구에는 위치 또는 더 구체적으로 입구와의 거리가 있습니다.

ParkingLotSign은 클래스입니다.

ParkingLot에는 ParkingLotSign이 있습니다.

ParkingLot에는 제한된 수의 ParkingSpace가 있습니다.

HandicappedParkingSpace는 ParkingSpace의 하위 클래스입니다.

RegularParkingSpace는 ParkingSpace의 하위 클래스입니다.

CompactParkingSpace는 ParkingSpace의 하위 클래스입니다.

ParkingLot는 ParkingSpaces의 배열을 유지하고 입구로부터의 거리순으로 별도의 빈 ParkingSpaces 배열을 유지합니다.

ParkingLotSign은 .Full (), .Empty () 또는 .Normal ()을 호출하여 "full", "empty"또는 "blank / normal / partially occupied"를 표시하도록 지시 할 수 있습니다.

Parker는 클래스입니다.

Parker는 Park ()를 사용할 수 있습니다.

Parker는 Unpark () 할 수 있습니다.

Valet는 ParkingSpace를 반환하는 ParkingLot.FindVacantSpaceNearestEntrance ()를 호출 할 수있는 Parker의 하위 클래스입니다.

Parker에는 ParkingSpace가 있습니다.

Parker는 ParkingSpace.Take () 및 ParkingSpace.Vacate ()를 호출 할 수 있습니다.

Parker는 Entrance.Entering () 및 Entrance.Exiting ()을 호출하고 ParkingSpace는 ParkingLot가 차가 찼거나 비었을 때 ParkingLot에 알림을 보내 ParkingLot가 가득 차 있는지 여부를 결정할 수 있도록합니다. 새로 꽉 찼거나 새로 비어 있거나 새로 꽉 찼거나 비어 있지 않은 경우 ParkingLotSign.Full () 또는 ParkingLotSign.Empty () 또는 ParkingLotSign.Normal ()을 변경해야합니다.

HandicappedParker는 Parker의 하위 클래스이고 CompactParker는 Parker의 하위 클래스이고 RegularParker는 Parker의 하위 클래스 일 수 있습니다. (실제로 과잉 일 수 있습니다.)

이 솔루션에서는 Parker의 이름을 Car로 변경해야 할 수 있습니다.


32
차를 잊지 마세요.
ojblass

5
ParkingSpace는 왜 수업이어야합니까? 개체를 만들 필요가 없다고 생각합니까? 항상 모든 주차 공간은 장애인, 일반 또는 소형이어야합니다. ParkingSpace는 오히려 인터페이스 여야합니다.
name_masked 2010

11
아마 우리는 주차장에 층을 추가 할 수있을 것입니다.
Barry

13
ParkingLotSign 클래스가 존재하는 이유는 무엇입니까? 속성 (예 : bool isFull;)이 작동하지 않습니까?
Chinmay Nerurkar

3
주차장을 확장 할 수있는 이유는 무엇입니까? isHandicapped 필드와 isCompact 필드를 주차 공간에 두지 않는 이유는 무엇입니까?
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
효율성을 위해 차량 번호가있는 목록 대신 HashMap 사용
sanath_p 2014

5
ReleaseVehicle 후에 vacantParkingSpaces는 더 이상 정렬되지 않습니다. findNearestVacant가장 가까운 주차 공간 을 반환 하도록 정렬해야합니다 .
laike9m

1
함수 findNearestVacant의 구현이 "가장 가까운"공간이 아닌 빈 공간 만 찾을 때 함수 이름이 인 이유는 무엇 입니까? "findVacant"가 아닌 이유는 무엇입니까? 클래스에 저장된 일부 상태를 사용하여 "가장 가까운"공간을 반환하는 것이 좋지만. 아마도, "가장 가까운"도 계산 될 수 있도록 "입구"와 "출구"로부터의 거리를 "공간"클래스에 저장할 수 있습니다. 또는 공간의 좌표 만 계산하여 모든 입구와 필요에 따라 출구를 계산할 수 있습니다.
Nawaz

1
또한이 함수 parkVehicle는 차량이 주차되었는지 여부를 나타내는 부울 값을 반환해야합니다.
Nawaz

null 검사가 없습니다. NPE를 던질 것입니다
hitesh

10

모델은 고립되어 존재하지 않습니다. 주차장에 진입하는 자동차의 시뮬레이션을 위해 정의한 구조, 여유 공간으로 안내하는 임베디드 시스템, 주차 요금 청구 시스템 또는 주차장에서 일반적으로 사용되는 자동 게이트 / 티켓 기계에 대해 모두 다릅니다.


6

물체 지향 주차장에서는 자동차가 "주차 방법을 알고"있기 때문에 승무원이 필요하지 않습니다.

부지에서 사용할 수있는 차를 찾는 것은 어려울 것입니다. 가장 일반적인 모델은 모든 움직이는 부품이 공개 멤버 변수로 노출되거나 창문이나 문이없는 "완전히 캡슐화 된"자동차입니다.

OO 주차장의 주차 공간은 차량의 크기 및 모양과 일치하지 않습니다 (공간과 차량 간의 "조밀 불일치").

부지의 라이센스 태그에는 각 문자와 숫자 사이에 점이 있습니다. 장애인 주차는 "_"로 시작하는 면허 만 이용 가능하며 "m_"로 시작하는 면허는 견인됩니다.


5

"공간"유형의 다차원 배열 (생성자에 지정됨)을 보유하는 주차장이 필요합니다. 주차장은 공간을 채우고 비우는 함수에 대한 호출을 통해 얼마나 많은 공간을 차지했는지 추적 할 수 있으며 공간은 어떤 종류의 공간인지 알려주는 열거 형을 보유 할 수 있습니다. 공간에는 또한 taken () 메서드가 있습니다. 주차 대행을 위해 첫 번째로 열리는 공간을 찾아 차를 거기에 두십시오. 또한 장애인, 소형 또는 일반 차량인지 여부를 담을 수있는 공간에 넣을 Car 개체가 필요합니다.


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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.