【问题标题】:Amazon Interview Question: Design an OO parking lot [closed]亚马逊面试题:设计一个面向对象的停车场[关闭]
【发布时间】:2010-10-20 09:06:06
【问题描述】:

设计一个面向对象的停车场。它将具有哪些类和功能。它应该说,满的,空的,也能找到代客泊车的地方。该地段有 3 种不同类型的停车场:普通、残疾人和紧凑型。

谢谢!

【问题讨论】:

  • 你有没有跳起来惊呼“这和书有什么关系?”然后暴走?
  • 我被一个人问到另一个情况。当我恰当地使用近乎教科书的“四人帮”模式时,他说“至少你知道多态性”。然后感谢我的到来,并告诉他们会让我知道。我没有留下深刻的印象。
  • 这不是内存管理问题吗?
  • 当被问到这个问题时,您是否真的需要在 CollabEdit 上写出类和函数,还是只需要谈论它们?
  • 看看吧。 github.com/shanshaji/parking-lot,希望对你有帮助

标签: oop


【解决方案1】:
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,
}

【讨论】:

  • 使用 HashMap 代替以车号为关键的列表以提高效率
  • 释放车辆后,vacantParkingSpaces 不再排序。您必须对其进行排序,以便findNearestVacant 返回最近的停车位。
  • 为什么函数被命名为findNearestVacant,而它的实现只找到一个空白空间,而不一定是“最近”的?为什么不“找空”?尽管使用存储在类中的一些状态返回“最近”空间会很好。也许,我们可以将“入口”和“出口”的距离存储在“空间”类中,以便也可以计算“最近”或者我们可以简单地空间的坐标,以便所有入口和出口的距离可以根据需要计算退出。
  • 另外,函数parkVehicle 应该返回一个布尔值,指示车辆是否停放。
  • 无空检查。会抛出NPE
【解决方案2】:

模型不是孤立存在的。您为模拟进入停车场的汽车、引导您到空闲空间的嵌入式系统、停车场计费系统或停车场中常见的自动门/票机定义的结构都是不同的。

【讨论】:

    【解决方案3】:

    您需要一个停车场,其中包含一个“空间”类型的多维数组(在构造函数中指定)。停车场可以通过调用填充和清空空间的函数来跟踪占用了多少空间。空间可以保存一个枚举类型,告诉它是什么类型的空间。 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; }

    【讨论】:

      【解决方案4】:

      在面向对象的停车场中,不需要服务员,因为汽车会“知道如何停车”。

      在地块上找到一辆可用的汽车很困难;最常见的模型要么将其所有移动部件公开为公共成员变量,要么将它们“完全封装”为没有窗户或门的汽车。

      我们的 OO 停车场的停车位与汽车的大小和形状不匹配(空间和汽车之间的“阻抗不匹配”)

      我们拍品上的许可证标签在每个字母和数字之间都有一个点。残障人士停车将仅适用于以“_”开头的许可证,以“m_”开头的许可证将被拖走。

      【讨论】:

        【解决方案5】:

        这是让齿轮转动的快速入门...

        ParkingLot 是一个类。

        ParkingSpace 是一个类。

        ParkingSpace 有一个入口。

        入口有一个位置,或者更具体地说,是与入口的距离。

        ParkingLotSign 是一个类。

        ParkingLot 有一个 ParkingLotSign。

        ParkingLot 的停车位数量有限。

        HandicappedParkingSpace 是 ParkingSpace 的子类。

        RegularParkingSpace 是 ParkingSpace 的子类。

        CompactParkingSpace 是 ParkingSpace 的子类。

        ParkingLot 保留一系列 ParkingSpaces,以及一个单独的空置 ParkingSpaces 数组,按与其入口的距离顺序排列。

        ParkingLotSign 可以通过调用 .Full()、.Empty() 或 .Normal() 被告知显示“已满”、“空”或“空白/正常/部分占用”

        帕克是一个阶级。

        Parker can Park().

        Parker 可以 Unpark()。

        Valet 是 Parker 的子类,可以调用 ParkingLot.FindVacantSpaceNearestEntrance(),返回一个 ParkingSpace。

        派克有一个停车位。

        Parker 可以调用 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。

        【讨论】:

        • 请不要忘记开车。
        • 为什么 ParkingSpace 必须是一个类?我认为不需要为它创建一个对象?在任何时候,任何停车位都必须是残疾人、普通或紧凑型。 ParkingSpace 应该是一个界面。
        • 或许我们可以给停车场加楼层..
        • 为什么存在 ParkingLotSign 类?一个属性(比如,bool isFull;)不会起作用吗?
        • 为什么要让停车位可扩展?为什么不在停车位上设置一个 isHandicapped 字段和一个 isCompact 字段?
        猜你喜欢
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2012-03-16
        • 2011-08-10
        相关资源
        最近更新 更多