一、题目描述
特定大小的停车场,数组cars[]表示,其中1表示有车,0表示没车。
车辆大小不一,小车占一个车位(长度1),货车占两个车位(长度2),卡车占三个车位(长度3)。
统计停车场最少可以停多少辆车,返回具体的数目。
二、输入描述
整型字符串数组cars[],其中1表示有车,0表示没车,数组长度小于1000。
输入0,0,1,0,1,1,1,0,0,1,1,0。
输入说明:
小车占一个车位(长度1),货车占两个车位(长度2),卡车占三个车位(长度3)。
1表示1个小车,两个连续的1表示货车,三个连续的1表示卡车。
三、输出描述
整型数字字符串,表示最少停车数目。
四、测试用例
测试用例1
1、输入
1,1,0,1,1,1,0,1
2、输出
3
3、说明
第1-2个元素连续两个1,表示一辆货车。
第4-6个元素连续三个1,表示一辆卡车。
第8个元素是一个1,表示一辆小车。
一辆货车、一辆卡车、一辆小车,总共3辆车。
测试用例1
1、输入
1,1,1,1,0,1,1,0,1
2、输出
4
3、说明
第1-4个元素连续4个1,有1辆卡车和1辆小车,最少为2辆车。
第6-7个元素是1辆货车,最少为1辆车。
第9个元素是1辆小车,最少为1辆车。
所以总共是4辆车。
五、解题思路
- 遍历输入数组cars[],统计连续的1,根据不同的连续长度,将它们对应成不同的车(小车、货车、卡车)。
- 当我们遇到“0”时,意味着当前的一段连续的“1”已经结束,可以将这一段的连续“1”对应为相应的车辆。
- 重复此过程直到遍历完整个数组。
六、Java算法源码
public class Test00 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的整型字符串数组,转为cars数组
String input = scanner.nextLine();
String[] inputArr = input.split(",");
int[] cars = new int[inputArr.length];
for (int i = 0; i < inputArr.length; i++) {
cars[i] = Integer.parseInt(inputArr[i]);
}
// 计数停车的数量
int minCars = 0;
// 遍历数组,找到连续的"1",根据连续长度确定车辆类型
for (int i = 0; i < cars.length; i++) {
if (cars[i] == 1) {
int count = 0;
// 统计连续的1的个数
while (i < cars.length && cars[i] == 1) {
count++;
i++;
}
// 根据连续1的数量计算车辆数量
if (count >= 3) {
minCars += count / 3; // 每三个1是一辆卡车
count = count % 3;
}
if (count == 2) {
minCars += 1; // 两个1是一辆货车
} else if (count == 1) {
minCars += 1; // 一个1是一辆小车
}
}
}
// 输出最终的最少停车数量
System.out.println(minCars);
}
}
七、效果展示
1、输入
0,0,1,1,1,0,0,1,1,1,1
2、输出
3
3、说明
第3-5个元素连续三个1,表示一辆卡车。
第8-11个元素连续四个1,可以分为一辆卡车和一辆小车(前三个1为卡车,剩下一个1为小车)。
一辆卡车和一辆卡车加一辆小车,总共3辆车。