题目描述
停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。
为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此时的最大距离。
输入描述
- 一个用半角逗号分割的停车标识字符串,停车标识为0或1,0为空位,1为已停车。
- 停车位最多100个。
输出描述
输出一个整数记录最大距离。
用例
输入 | 1,0,0,0,0,1,0,0,1,0,1 |
输出 | 2 |
说明 |
当车停在第3个位置上时,离其最近的的车距离为2(1到3)。 当车停在第4个位置上时,离其最近的的车距离为2(4到6)。 其他位置距离为1。 因此最大距离为2 |
题目解析
本题类似于
本题也可以采用两步走:
- 正向遍历一遍,确认每个空闲车位的左边的最大停车距离(即当前空闲车位的左边连续空闲车位个数+1)
- 反向遍历一遍,确认每个空闲车位的右边的最大停车距离(即当前空闲车位的右边连续空闲车位个数+1)
而每个空闲车位的最大停车距离,取其左、右最大停车距离中的较小值。
最后,返回所有空闲车位中的最大停车距离即可。
本题需要注意的是,首尾如果是空闲车位的话:
- 对第0个空闲车位,其最大停车距离,取得是其右边的停车距离
- 对第n-1个空闲车位,其最大停车距离,取得是其左边的停车距离
Java算法源码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
System.out.println(getResult(nums));
}
public static int getResult(int[] nums) {
int n = nums.length;
// leftFree[i] 表示第i个车位的左边空闲车位个数
int[] leftFree = new int[n];
for (int i = 1; i < n; i++) {
if (nums[i] == 1) continue;
if (nums[i - 1] == 0) {
leftFree[i] = leftFree[i - 1] + 1;
} else {
leftFree[i] = 0;
}
}
// rightFree[i] 表示第i个车位的右边空闲车位个数
int[] rightFree = new int[n];
for (int i = n - 2; i >= 0; i--) {
if (nums[i] == 1) continue;
if (nums[i + 1] == 0) {
rightFree[i] = rightFree[i + 1] + 1;
} else {
rightFree[i] = 0;
}
}
// 如果第0个车位是空闲车位,那么第0个车位的最大距离就是它右边的空闲车位个数
// 如果第n-1个车位是空闲车位,那么第n-1个车位的最大安全距离就是它左边的空闲车位个数
int ans = Math.max(rightFree[0], leftFree[n - 1]);
// 对于第i个车位(i取值1~n-2),其最大距离取min(leftFree[i], rightFree[i])
for (int i = 1; i < n - 1; i++) {
if (nums[i] == 1) continue;
ans = Math.max(ans, Math.min(leftFree[i], rightFree[i]));
}
// ans记录的空闲车位数,转化为距离要+1
return ans + 1;
}
}
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const nums = line.split(",").map(Number);
console.log(getResult(nums));
});
function getResult(nums) {
const n = nums.length;
// leftFree[i] 表示第i个车位的左边空闲车位个数
const leftFree = new Array(n).fill(0);
for (let i = 0; i < n; i++) {
if (nums[i] == 1) continue;
if (nums[i - 1] == 0) {
leftFree[i] = leftFree[i - 1] + 1;
} else {
leftFree[i] = 0;
}
}
// rightFree[i] 表示第i个车位的右边空闲车位个数
const rightFree = new Array(n).fill(0);
for (let i = n - 2; i >= 0; i--) {
if (nums[i] == 1) continue;
if (nums[i + 1] == 0) {
rightFree[i] = rightFree[i + 1] + 1;
} else {
rightFree[i] = 0;
}
}
// 如果第0个车位是空闲车位,那么第0个车位的最大距离就是它右边的空闲车位个数
// 如果第n-1个车位是空闲车位,那么第n-1个车位的最大安全距离就是它左边的空闲车位个数
let ans = Math.max(rightFree[0], leftFree[n - 1]);
// 对于第i个车位(i取值1~n-2),其最大距离取min(leftFree[i], rightFree[i])
for (let i = 1; i < n - 1; i++) {
if (nums[i] == 1) continue;
ans = Math.max(ans, Math.min(leftFree[i], rightFree[i]));
}
return ans + 1;
}
Python算法源码
# 输入获取
nums = list(map(int, input().split(",")))
# 算法入口
def getResult():
n = len(nums)
# leftFree[i] 表示第i个车位的左边空闲车位个数
leftFree = [0]*n
for i in range(n):
if nums[i] == 1:
continue
if nums[i-1] == 0:
leftFree[i] = leftFree[i-1] + 1
else:
leftFree[i] = 0
# rightFree[i] 表示第i个车位的右边空闲车位个数
rightFree = [0]*n
for i in range(n-2, -1, -1):
if nums[i] == 1:
continue
if nums[i+1] == 0:
rightFree[i] = rightFree[i+1] + 1
else:
rightFree[i] = 0
# 如果第0个车位是空闲车位,那么第0个车位的最大距离就是它右边的空闲车位个数
# 如果第n-1个车位是空闲车位,那么第n-1个车位的最大安全距离就是它左边的空闲车位个数
ans = max(rightFree[0], leftFree[n-1])
# 对于第i个车位(i取值1~n-2),其最大距离取min(leftFree[i], rightFree[i])
for i in range(1, n-1):
if nums[i] == 1:
continue
ans = max(ans, min(leftFree[i], rightFree[i]))
# ans记录的空闲车位数,转化为距离要+1
return ans + 1
# 算法调用
print(getResult())
C算法源码
#include <stdio.h>
#include <stdlib.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX_SIZE 100
int main() {
int nums[MAX_SIZE];
int nums_size = 0;
while (scanf("%d", &nums[nums_size++])) {
if (getchar() != ',') break;
}
// leftFree[i] 表示第i个车位的左边空闲车位个数
int* leftFree = (int*) calloc(nums_size, sizeof(int));
for (int i = 1; i < nums_size; i++) {
if (nums[i] == 1) continue;
if (nums[i - 1] == 0) {
leftFree[i] = leftFree[i - 1] + 1;
} else {
leftFree[i] = 0;
}
}
// rightFree[i] 表示第i个车位的右边空闲车位个数
int* rightFree = (int*) calloc(nums_size, sizeof(int));
for (int i = nums_size - 2; i >= 0; i--) {
if (nums[i] == 1) continue;
if (nums[i + 1] == 0) {
rightFree[i] = rightFree[i + 1] + 1;
} else {
rightFree[i] = 0;
}
}
// 如果第0个车位是空闲车位,那么第0个车位的最大距离就是它右边的空闲车位个数
// 如果第n-1个车位是空闲车位,那么第n-1个车位的最大安全距离就是它左边的空闲车位个数
int ans = MAX(rightFree[0], leftFree[nums_size - 1]);
// 对于第i个车位(i取值1~n-2),其最大距离取min(leftFree[i], rightFree[i])
for (int i = 1; i < nums_size - 1; i++) {
if (nums[i] == 1) continue;
ans = MAX(ans, MIN(leftFree[i], rightFree[i]));
}
// ans记录的空闲车位数,转化为距离要+1
printf("%dn", ans + 1);
return 0;
}
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0