【华为OD机试真题 C语言】24、找车位 | 机试真题+思路参考+代码解析(C卷)(本题100%)

本文提供华为在线开发者(OD)机试中关于找车位问题的C语言解题思路和代码参考。通过分析输入的停车标识字符串,计算并返回车位间最大距离。
摘要由CSDN通过智能技术生成


🍂个人博客首页: 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个位置上时,离其最近的的车距离为213)。

当车停在第4个位置上时,离其最近的的车距离为246)。

其他位置距离为1。

因此最大距离为2

🎃样例2

输入
0,1,0,0,0,0,0,0,0,0,1


输出
4

二、思路参考


  1. 将输入的停车位信息字符串分割为整数数组,表示停车位的状态。
  2. 初始化left_distance和right_distance数组,将所有位置的距离初始化为停车位数量n。
  3. 从左向右遍历停车位数组,如果当前位置有车,则距离为0;否则,距离等于左侧位置的距离加1。
  4. 从右向左遍历停车位数组,如果当前位置有车,则距离为0;否则,距离等于右侧位置的距离加1。
  5. 遍历每个停车位,如果当前位置为空位,则计算到最近车辆的最小距离,并更新最大距离。
  6. 返回最大距离。

三、代码参考

#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;
}


作者:KJ.JK

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KJ.JK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值