停车场系统设计

笔试题-停车场系统设计

题目

设计一个大楼的停车场系统,在大楼的入口处有一个自动售票以及显示等待时间的仪表。该仪表能够显示下一个空车位的最少等待时间。
例如,一个停车场有三个停车位分别为A,B,C。初始状态为空车位(Available)。

假设场景
9:00 AM
一号汽车驶入,输入预计离开时间 11:00 AM. 系统查询车位,发现三个车位有空位,随机分发A号车位给一号汽车。一号汽车停入A号车位。

9:30 AM
二号汽车驶入,输入预计离开时间12:00PM.系统查询车位,发现有两个车位有空位,随机分发B号车位给二号汽车。二号汽车停入B号车位。

10:00AM
三号汽车驶入,输入预计离开时间1:00PM。系统查询车位,发现仅剩一个空车位C号,随分配C号车位给三号汽车,三号汽车停入C号车位。

10:30AM
四号汽车驶入,输入预计离开时间2:00PM。系统查询车位,发现所有车位已满。同时发现A号车位的一号汽车即将于11:00AM离开,系统随机返回给四号汽车,您的最少等待时间为30分钟(11:00 – 10:30 = 30)

代码:

/**
 * 停车场
 */
public class ParkingSpace {
    private ArrayList<Carport> carports = new ArrayList<>();

    private int capacity;

    public ParkingSpace(int capacity) {
        this.capacity = capacity;
    }

    /**
     * 停车前判断是否需要等待以及等待时间,如不需要等待则返回0,需要等待则返回等待时间
     *
     * 时间复杂度o(1)
     *
     * @param leaveTime
     * @return
     */
    public Long parking(String leaveTime){
        // 查询是否由可用车位,如有,等待时间为0
        if(carports.size()<capacity){
            // 分配一个车库,设置离开时间,并将状态设置为不可用
            Carport carport = new Carport();
            carport.setLeaveTime(leaveTime);
            carport.setAvailable(false);
            carports.add(carport);
            return 0l;
        }else {
            // 查询等待时间
            return queryWartingTime();
        }
    }

    public ArrayList<Carport> getCarports() {
        return carports;
    }

    public void setCarports(ArrayList<Carport> carports) {
        this.carports = carports;
    }

    public int getCapacity() {
        return capacity;
    }

    public void setCapacity(int capacity) {
        this.capacity = capacity;
    }


    /**
     * 更新等待时间
     *
     * 时间复杂度o(n^2)
     * @return
     */
    public Long queryWartingTime(){
        for (Carport carport : carports){
            carport.setWaitingTime(carport.calculateWaitingTime());
        }

        carports.sort(new Comparator<Carport>(){
            @Override
            public int compare(Carport o1, Carport o2) {
                return o1.getWaitingTime().compareTo(o2.getWaitingTime());
            }
        });
        return carports.get(0).getWaitingTime();
    }
}
/**
 * 车位
 */
public class Carport {
    /**
     * 是否可用,默认true
     */
    private boolean isAvailable = true;
    /**
     * 离开车位时间
     */
    private Date leaveTime;
    /**
     * 等待时间
     */
    private Long waitingTime;

    /**
     * 计算等待时间
     * @return
     */
    public Long calculateWaitingTime(){
        // 获取当前时间
        Date currentDate = new Date();
        // 如果当前时间晚于离开时间,不用等待,等待时间设置为 -1
        if(currentDate.after(getLeaveTime())){
            return -1l;
        }
        // 计算等待时间 毫秒
        long timeDiff = leaveTime.getTime()- currentDate.getTime();

        // 毫秒转换为分 并返回
        return TimeUnit.SECONDS.toMinutes(timeDiff/1000);
    }

    public void setWaitingTime(Long waitingTime) {
        this.waitingTime = waitingTime;
    }

    public Long getWaitingTime() {
        return waitingTime;
    }

    public boolean isAvailable() {

        return isAvailable;
    }

    public void setAvailable(boolean available) {
        isAvailable = available;
    }

    public Date getLeaveTime() {
        return leaveTime;
    }

    public void setLeaveTime(Date leaveTime) {
        this.leaveTime = leaveTime;
    }

    /**
     * 将字符串时间转换为date
     *
     * 时间复杂度o(1)
     *
     * @param leaveTime
     */
    public void setLeaveTime(String leaveTime){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            setLeaveTime(simpleDateFormat.parse(leaveTime));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

运行

// 四辆车的预计离开时间
        String carALeaveTime = "2021-03-30 21:54:00";
        String carBLeaveTime = "2021-03-30 21:59:00";
        String carCLeaveTime = "2021-03-30 21:56:00";
        String carDLeaveTime = "2021-03-30 21:57:30";

        ParkingSpace parkingSpace = new ParkingSpace(3);

        System.out.println("a预计等待时间:"+parkingSpace.parking(carALeaveTime));
        System.out.println("b预计等待时间:"+parkingSpace.parking(carBLeaveTime));
        System.out.println("c预计等待时间:"+parkingSpace.parking(carCLeaveTime));
        System.out.println("c预计等待时间:"+parkingSpace.parking(carDLeaveTime));
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pandamig

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值