คำถามสัมภาษณ์ Amazon: ออกแบบที่จอดรถ OO [ปิด]


114

ออกแบบที่จอดรถ OO จะมีคลาสและฟังก์ชันอะไรบ้าง ควรบอกว่าเต็มว่างเปล่าและยังสามารถหาจุดจอดรถได้ ที่จอดรถมี 3 ประเภท ได้แก่ แบบธรรมดาคนพิการและขนาดกะทัดรัด

ขอบคุณ!


39
คุณกระโดดขึ้นมาและอุทานว่า "มันเกี่ยวอะไรกับหนังสือ?" และพายุออกมา?
JP Alioto

ฉันถูกถามโดยผู้ชายคนหนึ่งที่ไปสถานการณ์อื่น เมื่อฉันใช้รูปแบบ Gang of Four ในตำราเรียนอย่างเหมาะสมเขากล่าวว่า "อย่างน้อยคุณก็รู้จักความหลากหลาย" จากนั้นฉันก็ขอบคุณที่มาและบอกพวกเขาว่าจะแจ้งให้ฉันทราบ ฉันไม่ประทับใจเลย
David Thornley

นี่ไม่ใช่ปัญหาการจัดการหน่วยความจำ?
Sanjeev Kumar Dangi

1
เมื่อถูกถามคำถามนี้คุณต้องเขียนคลาสและฟังก์ชั่นใน CollabEdit หรือไม่หรือคุณต้องพูดถึงคลาสเหล่านี้
committedandroider

ลองดูสิ github.com/shanshaji/parking-lotหวังว่ามันจะช่วย
Shan

คำตอบ:


159

นี่คือการเริ่มต้นอย่างรวดเร็วเพื่อให้เกียร์เปลี่ยน ...

ParkingLot เป็นคลาส

ParkingSpace เป็นคลาส

ParkingSpace มีทางเข้า

ทางเข้ามีสถานที่ตั้งหรือโดยเฉพาะอย่างยิ่งระยะทางจากทางเข้า

ParkingLotSign เป็นคลาส

ParkingLot มี ParkingLotSign

ParkingLot มี ParkingSpaces จำนวน จำกัด

HandicappedParkingSpace เป็นคลาสย่อยของ ParkingSpace

RegularParkingSpace เป็นคลาสย่อยของ ParkingSpace

CompactParkingSpace เป็นคลาสย่อยของ ParkingSpace

ParkingLot เก็บอาร์เรย์ของ ParkingSpaces และอาร์เรย์ของ ParkingSpaces ว่างแยกตามลำดับระยะทางจากทางเข้า

ParkingLotSign สามารถบอกให้แสดง "เต็ม" หรือ "ว่าง" หรือ "ว่าง / ปกติ / ว่างบางส่วน" โดยเรียก. Full (), .Empty () หรือ. Normal ()

ปาร์คเกอร์เป็นคลาส

ปาร์คเกอร์สามารถจอด ().

Parker สามารถ Unpark ()

Valet เป็นคลาสย่อยของ Parker ที่สามารถเรียก ParkingLot.FindVacantSpaceNearestEntrance () ซึ่งส่งคืน ParkingSpace

Parker มี 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


32
โปรดอย่าลืมรถ
ojblass

5
ทำไม ParkingSpace ถึงต้องเป็นคลาส? ฉันไม่เห็นความจำเป็นที่จะต้องสร้างวัตถุสำหรับมัน? ตลอดเวลาที่จอดรถจะต้องมีทั้งแบบสำหรับคนพิการแบบธรรมดาหรือแบบกะทัดรัด ParkingSpace ควรเป็นอินเตอร์เฟสมากกว่า
name_masked

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

5
หลังจากที่คุณปล่อยยานพาหนะvacantParkingSpacesจะไม่ถูกจัดเรียงอีกต่อไป คุณต้องจัดเรียงเพื่อให้findNearestVacantคืนพื้นที่จอดรถที่ใกล้ที่สุด
laike9m

1
เหตุใดจึงมีการตั้งชื่อฟังก์ชันfindNearestVacantเมื่อการใช้งานพบเฉพาะพื้นที่ว่างไม่จำเป็นต้องเป็น "ที่ใกล้ที่สุด" ทำไมไม่ "findVacant"? แม้ว่าจะเป็นการดีที่จะคืนพื้นที่ "ที่ใกล้ที่สุด" โดยใช้สถานะบางอย่างที่เก็บไว้ในคลาส บางทีเราสามารถจัดเก็บระยะทางจาก "ทางเข้า" และ "ทางออก" ในคลาส "ช่องว่าง" เพื่อให้สามารถคำนวณ "ที่ใกล้ที่สุด" ได้เช่นกันหรือเราสามารถกำหนดพิกัดของช่องว่างเพื่อให้ระยะทางจากทางเข้าทั้งหมดและ ทางออกสามารถคำนวณได้ตามความต้องการ
Nawaz

1
นอกจากนี้ฟังก์ชั่น parkVehicleควรส่งคืนค่าบูลีนที่ระบุว่ารถจอดอยู่หรือไม่
Nawaz

ไม่มีการตรวจสอบค่าว่าง จะโยน NPE
hitesh

10

ไม่มีโมเดลแยกต่างหาก โครงสร้างที่คุณกำหนดสำหรับการจำลองรถยนต์ที่เข้ามาในที่จอดรถระบบฝังตัวซึ่งจะนำคุณไปสู่พื้นที่ว่างระบบเรียกเก็บเงินสำหรับที่จอดรถหรือประตูอัตโนมัติ / เครื่องจำหน่ายตั๋วตามปกติในที่จอดรถล้วนแตกต่างกัน


6

ในลานจอดรถเชิงวัตถุไม่จำเป็นต้องมีคนดูแลเพราะรถจะ "รู้วิธีจอด"

การหารถที่ใช้งานได้ในล็อตจะเป็นเรื่องยาก โมเดลที่พบมากที่สุดจะมีชิ้นส่วนที่เคลื่อนไหวได้ทั้งหมดเป็นตัวแปรสาธารณะหรือจะเป็นรถยนต์ที่ "หุ้มเต็ม" ที่ไม่มีหน้าต่างหรือประตู

ที่จอดรถในที่จอดรถ OO ของเราจะไม่ตรงกับขนาดและรูปร่างของรถยนต์ ("ความต้านทานไม่ตรงกัน" ระหว่างช่องว่างและรถยนต์)

แท็กใบอนุญาตในล็อตของเราจะมีจุดระหว่างตัวอักษรและตัวเลขแต่ละตัว ที่จอดรถสำหรับผู้พิการจะใช้ได้เฉพาะกับใบอนุญาตที่ขึ้นต้นด้วย "_" และใบอนุญาตที่ขึ้นต้นด้วย "m_" จะถูกลากไป


5

คุณจะต้องมีที่จอดรถซึ่งเก็บอาร์เรย์หลายมิติ (ระบุในตัวสร้าง) ประเภท "ช่องว่าง" ที่จอดรถสามารถติดตามจำนวนช่องว่างที่ใช้ผ่านการเรียกไปยังฟังก์ชันที่เติมและช่องว่างช่องว่างสามารถระบุประเภทที่แจกแจงซึ่งบอกได้ว่าเป็นพื้นที่ประเภทใด Space ยังมีวิธีการ () สำหรับบริการจอดรถเพียงแค่หาที่ว่างแรกที่เปิดและวางรถไว้ที่นั่น นอกจากนี้คุณยังต้องมีวัตถุรถยนต์เพื่อวางในพื้นที่ซึ่งถือได้ว่าเป็นยานพาหนะสำหรับคนพิการขนาดกะทัดรัดหรือแบบธรรมดา


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.