Amazonインタビューの質問:オブジェクト指向の駐車場を設計する[終了]


114

OO駐車場を設計します。どのようなクラスと関数がありますか。それは、満員で空であり、バレーパーキングの場所を見つけることができるはずです。駐車場には、通常、障害者用、コンパクトの3種類の駐車場があります。

ありがとう!


39
あなたは跳び上がって「これは本とどう関係しているのですか」と叫びましたか?暴風雨?
JP Alioto

私は別の状況に行った男からそれを尋ねられました。教科書に近いGang of Fourパターンを適切に使用したとき、彼は「少なくともあなたは多態性を知っています」と言った。それから私は来てくれたことに感謝し、知らせてくれると言った。感動しませんでした。
David Thornley、

このメモリ管理の問題ではないですか?
Sanjeev Kumar Dangi 2013年

1
この質問をされたとき、CollabEditでクラスと関数を実際に作成する必要がありましたか、それともそれらについて話す必要がありましたか?
committedandroider

それを見てください。github.com/shanshaji/parking-lot、お役に立てば幸い
Shan

回答:


159

ここにギアを回すためのクイックスタートがあります...

ParkingLotはクラスです。

ParkingSpaceはクラスです。

ParkingSpaceには入り口があります。

入り口には、場所、つまり入り口からの距離があります。

ParkingLotSignはクラスです。

ParkingLotには、ParkingLotSignがあります。

ParkingLotの駐車スペースの数には限りがあります。

HandicappedParkingSpaceは、ParkingSpaceのサブクラスです。

RegularParkingSpaceは、ParkingSpaceのサブクラスです。

CompactParkingSpaceは、ParkingSpaceのサブクラスです。

ParkingLotは、ParkingSpacesの配列と、エントランスからの距離順に、空のParkingSpacesの個別の配列を保持します。

ParkingLotSignは、.Full()、. Empty()、または.Normal()を呼び出すことで、「完全」、「空」、または「空白/通常/部分的に占有」を表示するように指示できます。

パーカーはクラスです。

パーカーはPark()できます。

パーカーはUnpark()できます。

ValetはParkerのサブクラスであり、ParkingLot.FindVacantSpaceNearestEntrance()を呼び出して、ParkingSpaceを返すことができます。

パーカーにはパーキングスペースがあります。

パーカーは、ParkingSpace.Take()およびParkingSpace.Vacate()を呼び出すことができます。

Parkerは、Entrance.Entering()およびEntrance.Exiting()を呼び出し、ParkingSpaceは、駐車または空きが出たときに、ParkingLotに通知して、ParkingLotが満杯かどうかを判断できるようにします。新しくいっぱいになった、または新しく空になった、または新しくいっぱいになった、または空にならない場合は、ParkingLotSign.Full()、ParkingLotSign.Empty()、ParkingLotSign.Normal()を変更する必要があります。

HandicappedParkerはParkerのサブクラス、CompactParkerはParkerのサブクラス、RegularParkerはParkerのサブクラスにすることができます。(実際にはやり過ぎかもしれません。)

このソリューションでは、Parkerの名前をCarに変更する必要がある可能性があります。


32
車もお忘れなく。
ojblass 2009

5
なぜ駐車スペースはクラスでなければならないのですか?オブジェクトを作成する必要がありませんか?常に、駐車スペースはハンディキャップ、レギュラーまたはコンパクトでなければなりません。ParkingSpaceはむしろインターフェースであるべきです。
name_masked 2010

11
おそらく、我々は駐車場に床を追加することができます。..
バリー・

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 '11 / 11/20

5
あなたがVehicleをリリースした後、vacantParkingSpacesもうソートされていません。findNearestVacant最寄りの駐車スペースを返すように並べ替える必要があります。
laike9m

1
findNearestVacant実装が空のスペースのみを見つけ、必ずしも「最も近い」空スペースを見つけないのに、なぜ関数がと名付けられているのですか?なぜ「findVacant」ではないのですか?クラスに格納されているいくつかの状態を使用して、「最も近い」空間を返すのは良いことですが。たぶん、「入口」と「出口」からの距離を「スペース」クラスに格納して、「最近接」も計算できるようにするか、単純にスペースの座標を指定して、すべての入口からの距離と出口は必要に応じて計算できます。
Nawaz 2017年

1
また、関数parkVehicleは、車両が駐車されているかどうかを示すブール値を返す必要があります。
Nawaz

nullチェックはありません。NPEをスローします
hitesh

10

モデルは単独では存在しません。駐車場に入る車のシミュレーション、空きスペースに案内する組み込みシステム、駐車場課金システム、または駐車場で通常使用される自動化されたゲート/チケット機に定義する構造は、すべて異なります。


6

オブジェクト指向の駐車場では、車が「駐車方法を知っている」ため、アテンダントは必要ありません。

敷地内で使用可能な車を見つけるのは難しいでしょう。最も一般的なモデルでは、すべての可動部分がパブリックメンバー変数として公開されるか、窓やドアのない「完全にカプセル化された」車になります。

私たちのOO駐車場の駐車スペースは、車のサイズと形状と一致しません(スペースと車の間の「不一致」の不一致)。

私たちのロットのライセンスタグは、各文字と数字の間にドットがあります。障害者用駐車場は「_」で始まるライセンスでのみ利用でき、「m_」で始まるライセンスは牽引されます。


5

タイプ「スペース」の多次元配列(コンストラクターで指定)を保持する駐車場が必要になります。駐車場は、スペースを埋めたり空にしたりする関数の呼び出しを介して使用されるスペースの数を追跡できます。スペースは、スペースの種類を示す列挙型を保持できます。Spaceには、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.