设计停车系统

标签: 设计 计数 模拟

难度: Easy

请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。

请你实现 ParkingSystem 类:

  • ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。
  • bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 1, 2 和 3 表示。一辆车只能停在  carType 对应尺寸的停车位中。如果没有空车位,请返回 false ,否则将该车停入车位并返回 true 。

 

示例 1:

输入:
["ParkingSystem", "addCar", "addCar", "addCar", "addCar"]
[[1, 1, 0], [1], [2], [3], [1]]
输出:
[null, true, true, false, false]

解释:
ParkingSystem parkingSystem = new ParkingSystem(1, 1, 0);
parkingSystem.addCar(1); // 返回 true ,因为有 1 个空的大车位
parkingSystem.addCar(2); // 返回 true ,因为有 1 个空的中车位
parkingSystem.addCar(3); // 返回 false ,因为没有空的小车位
parkingSystem.addCar(1); // 返回 false ,因为没有空的大车位,唯一一个大车位已经被占据了

 

提示:

  • 0 <= big, medium, small <= 1000
  • carType 取值为 1, 2 或 3
  • 最多会调用 addCar 函数 1000 次

Submission

运行时间: 75 ms

内存: 16.6 MB

class ParkingSystem:

    def __init__(self, big: int, medium: int, small: int):
        self.parking = [big, medium, small]


    def addCar(self, carType: int) -> bool:
        if self.parking[carType-1]:
            self.parking[carType-1] -= 1
            return True
        return False



# Your ParkingSystem object will be instantiated and called as such:
# obj = ParkingSystem(big, medium, small)
# param_1 = obj.addCar(carType)

Explain

题解的核心思路是创建一个数组来存储每种车位的数量(大,中,小)。构造函数接收三种车位的数量并初始化数组。在addCar方法中,根据车辆类型(由carType - 1得到的索引),检查相应车位是否还有空间。如果有空间,就对应车位数量减一并返回true表示停车成功;如果没有空间,则直接返回false。

时间复杂度: O(1)

空间复杂度: O(1)

# 类定义

class ParkingSystem:

    def __init__(self, big: int, medium: int, small: int):
        # 初始化停车位计数器,索引0对应大车位,1对应中车位,2对应小车位
        self.parking = [big, medium, small]

    def addCar(self, carType: int) -> bool:
        # 检查对应类型的车位是否还有剩余
        if self.parking[carType-1]:
            # 如果有剩余,则减少一个该类型的车位并返回True
            self.parking[carType-1] -= 1
            return True
        # 如果没有剩余,则返回False
        return False

# 使用示例
# obj = ParkingSystem(big, medium, small)
# param_1 = obj.addCar(carType)

Explore

题解中的构造函数没有显式地处理车位数量为负数的情况。在实际应用中,应当在构造函数中添加检查,确保传入的车位数量不小于零。如果小于零,可以抛出异常或将值设为零,防止程序逻辑出错。

在addCar方法中,如果车位已经为零,则会直接返回false且不会减少车位数。因此,车位数不会变为负数,这种设计确保了车位计数的准确性。

在当前的实现中,如果车位已满,addCar方法仅返回false。没有提供其他错误提示或异常处理机制。在实际应用中,可以考虑增加日志记录或抛出自定义异常来提供更清晰的错误反馈。

当前实现在多线程环境下不是线程安全的。多个线程可能同时修改数组,导致数据不一致。为了使其线程安全,可以使用锁(如 threading.Lock 在 Python 中)来同步对数组的访问,确保一次只有一个线程可以修改车位数量。