🍂个人博客首页: KJ.JK
🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习
一、题目
🎃题目描述
停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。
为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此时的最大距离
🎃输入输出
输入
1、一个用半角逗号分割的停车标识字符串,停车标识为0或1,0为空位,1为已停车。
2、停车位最多100个。
输出
输出一个整数记录最大距离。
🎃样例1
输入
1,0,0,0,0,1,0,0,1,0,1
输出
2
说明:
当车停在第3个位置上时,离其最近的的车距离为2(1到3)。
当车停在第4个位置上时,离其最近的的车距离为2(4到6)。
其他位置距离为1。
因此最大距离为2。
🎃样例2
输入
0,1,0,0,0,0,0,0,0,0,1
输出
4
二、思路参考
- 将输入的停车位信息字符串分割为整数数组,表示停车位的状态。
- 初始化left_distance和right_distance数组,将所有位置的距离初始化为停车位数量n。
- 从左向右遍历停车位数组,如果当前位置有车,则距离为0;否则,距离等于左侧位置的距离加1。
- 从右向左遍历停车位数组,如果当前位置有车,则距离为0;否则,距离等于右侧位置的距离加1。
- 遍历每个停车位,如果当前位置为空位,则计算到最近车辆的最小距离,并更新最大距离。
- 返回最大距离。
三、代码参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1024 // 定义最大字符串长度
// 将字符串分割为整数数组的函数
int splitToInt(const char* str, int* arr) {
int count = 0; // 计数器,记录数组中元素的数量
// 使用strtok分割字符串,","为分割符
const char* token = strtok((char*)str, ",");
while(token != NULL) {
arr[count++] = atoi(token); // 将分割得到的字符串转换为整数并存储
token = strtok(NULL, ","); // 继续分割直至结束
}
return count; // 返回数组中元素的数量
}
// 寻找最大距离的函数
int findMaxDistance(const char* parking_str) {
int parking[MAX_SIZE]; // 存储停车位信息的数组
// 将输入字符串分割为整数数组,n为停车位数量
int n = splitToInt(parking_str, parking);
int left_distance[MAX_SIZE]; // 记录每个位置到左侧最近车辆的距离
int right_distance[MAX_SIZE]; // 记录每个位置到右侧最近车辆的距离
// 初始化数组
for(int i = 0; i < n; i++) {
left_distance[i] = n;
right_distance[i] = n;
}
// 从左向右遍历,填充left_distance数组
for(int i = 0; i < n; i++) {
if(parking[i] == 1) {
left_distance[i] = 0; // 如果当前位置有车,则距离为0
} else if(i > 0) {
left_distance[i] = left_distance[i - 1] + 1; // 否则,距离等于左侧位置的距离+1
}
}
// 从右向左遍历,填充right_distance数组
for(int i = n - 1; i >= 0; i--) {
if(parking[i] == 1) {
right_distance[i] = 0; // 如果当前位置有车,则距离为0
} else if(i < n - 1) {
right_distance[i] = right_distance[i + 1] + 1; // 否则,距离等于右侧位置的距离+1
}
}
int max_distance = 0; // 记录最大的最小距离
// 遍历每个停车位
for(int i = 0; i < n; i++) {
if(parking[i] == 0) { // 只对空位进行处理
// 计算到最近车辆的最小距离
int dist = left_distance[i] < right_distance[i] ? left_distance[i] : right_distance[i];
// 更新最大距离
if(dist > max_distance) {
max_distance = dist;
}
}
}
return max_distance; // 返回最大的最小距离
}
int main() {
char input[MAX_SIZE]; // 输入字符串
fgets(input, MAX_SIZE, stdin); // 从标准输入读取一行
// 删除输入字符串末尾的换行符
input[strcspn(input, "\\n")] = 0;
// 输出计算结果
printf("%d", findMaxDistance(input));
return 0;
}