华为 OD 训练营 · 题解精讲
LC1603. 设计停车系统
题目描述
题目解析
题目在说什么
这道题是让我们设计一个停车系统。停车场有三种类型的车位:大型车(big)、中型车(medium)、小型车(small)。每种车位的数量在系统初始化时由你设定(比如 big=1, medium=2, small=3)。然后,系统会不断有车进来停车,每辆车会告诉你它的类型(1代表大型,2代表中型,3代表小型)。你要判断这辆车能不能停进去:如果对应类型的车位还有空位,就让它停进去,同时该类型车位数量减1,返回 true;如果没有空位了,就返回 false。
简单说,就是管理三种车位的剩余数量,每次来车就检查并减少对应车位。
思路是怎么来的
想象你是一个停车场管理员,手里有三个计数器,分别记录大型、中型、小型车位的剩余数量。一开始,你根据老板给的数字设置好这三个计数器(比如 big=1, medium=2, small=3)。然后,每来一辆车,你就看一眼它的类型,然后去查对应的计数器:如果计数器大于0,说明还有空位,就让它进去,同时把计数器减1;如果计数器是0,就说“没位置了”,不让它进。
这个思路非常直接,因为问题本身就是模拟这个计数过程。我们不需要复杂的算法,只需要一个能存储三个数字的容器,并且能根据车类型快速找到对应的数字去检查和更新。数组正好适合这个需求:用下标1表示大型车,下标2表示中型车,下标3表示小型车,这样 carType 直接作为下标就能拿到对应的剩余数量。
代码逐步拆解
我们来看参考代码,一行一行解释。
class ParkingSystem {
// 数组park用于存储停车位数量,park[1]表示big,park[2]表示medium,park[3]表示small
private int[] park;这里定义了一个类 ParkingSystem,里面有一个私有成员变量 park,它是一个整型数组。数组的每个位置存放一个数字,代表某种车位的剩余数量。注意注释说 park[1] 是 big,park[2] 是 medium,park[3] 是 small。为什么从1开始?因为车的类型是1、2、3,这样直接用 carType 当索引就很方便。
public ParkingSystem(int big, int medium, int small) {
// 初始化停车位数量
park = new int[]{0, big, medium, small}; // park[0]占位
}这是构造方法,在创建 ParkingSystem 对象时调用。它接收三个参数:big、medium、small,分别代表三种车位的初始数量。然后它创建了一个长度为4的数组:第一个元素是0(占位用,因为数组下标从0开始,但我们不用0),后面三个依次是 big、medium、small。这样 park[1] 就是 big,park[2] 就是 medium,park[3] 就是 small。为什么非要加个0占位?因为这样可以让 carType 直接作为下标,不用做减1操作,代码更简洁。
public boolean addCar(int carType) {
// 如果对应类型的车位已经没有了,返回false
if (park[carType] == 0) {
return false;
}
// 否则当前类型车位减少一个,返回true
park[carType]--;
return true;