华为OD机试 - 停车场最大距离 - 数组(Python/JS/C/C++ 2025 B卷 100分)

在这里插入图片描述

2025B卷华为OD机试统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。

为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此时的最大距离。

二、输入描述

1、一个用半角逗号分割的停车标识字符串,停车标识为0或1,0为空位,1为已停车。

2、停车位最多100个。

三、输出描述

输出一个整数记录最大距离。

四、测试用例

测试用例1

1、输入

1,0,0,0,1

2、输出

2

3、说明

停车场状态 [1, 0, 0, 0, 1]。

若停在索引1 (0): 左侧车(索引0)距离1, 右侧车(索引4)距离3。最近距离是 min(1,3) = 1。

若停在索引2 (0): 左侧车(索引0)距离2, 右侧车(索引4)距离2。最近距离是 min(2,2) = 2。

若停在索引3 (0): 左侧车(索引0)距离3, 右侧车(索引4)距离1。最近距离是 min(3,1) = 1。 这些最近距离中的最大值是2。

测试用例2

1、输入

0,0,1,0,0

2、输出

2

3、说明

停车场状态 [0, 0, 1, 0, 0]。

若停在索引0 (0): 最近的车在索引2, 距离为 2-0 = 2。

若停在索引1 (0): 最近的车在索引2, 距离为 2-1 = 1。

若停在索引3 (0): 最近的车在索引2, 距离为 3-2 = 1。

若停在索引4 (0): 最近的车在索引2, 距离为 4-2 = 2。 这些最近距离中的最大值是2。

五、解题思路

1、核心思路

题目要求找到一个空车位,使得如果我们选择停在这个空位上,那么这个新停的车距离它左右两边最近的已有车辆的距离是最大的。换句话说,对于每一个空车位,我们计算它到左边最近车的距离和到右边最近车的距离,取这两者中的较小值(这就是如果我们停在这个空位,能保证的最小安全距离)。然后,在所有空位计算出的这些“最小安全距离”中,找到一个最大的值。

2、详细步骤

  1. 输入处理:
    • 通过 Scanner 读取控制台输入的一行字符串。
    • 使用 String.split(“,”) 方法将字符串按逗号分割,得到每个车位状态的字符串表示。
    • 将这些字符串转换为整数 0 或 1,并存储到 spots 数组中。
  2. 遍历寻找最优空位:
    • 初始化一个变量 maxOverallMinDistance = 0,用来记录最终要输出的最大距离。
    • 遍历 spots 数组中的每一个车位(索引 i)。
    • 判断是否为空位: 如果 spots[i] 为 0,则这是一个可以考虑的空位。
      • 为这个空位 i 初始化一个 currentSpotMinDistToCar = Integer.MAX_VALUE,表示如果停在这里,它到最近车的距离。
      • 向左查找: 从 i-1 开始向左遍历,找到第一个值为 1 的车位(即左边最近的车)。计算距离 distLeft = i - (左车索引)。如果左边没有车,distLeft 保持为一个极大值(或标记为无穷大)。
      • 向右查找: 从 i+1 开始向右遍历,找到第一个值为 1 的车位(即右边最近的车)。计算距离 distRight = (右车索引) - i。如果右边没有车,distRight 保持为一个极大值。
      • 确定当前空位的最小距离:
      • 如果左右都有车,currentSpotMinDistToCar = Math.min(distLeft, distRight)。
      • 如果只有左边有车,currentSpotMinDistToCar = distLeft。
      • 如果只有右边有车,currentSpotMinDistToCar = distRight。 (根据题目“至少停了一辆车”,一个空位至少能在一侧找到车,所以 currentSpotMinDistToCar 一定会被有效赋值。)
      • 更新全局最大值: maxOverallMinDistance = Math.max(maxOverallMinDistance, currentSpotMinDistToCar)。
  3. 输出结果: 打印 maxOverallMinDistance。

六、Python算法源码

# 读取控制台输入的一行字符串
line = input()
# 使用逗号作为分隔符,将输入字符串分割成字符串列表
parts = line.split(',')
# 获取停车位的总数
n = len(parts)
# 创建一个整型列表用于存储每个停车位的状态 (0或1)
spots = [0] * n

# 将字符串列表中的每个元素转换为整数,并存入spots列表
for i in range(n):
    spots[i] = int(parts[i].strip()) # strip()确保去除可能存在的空格

max_overall_min_distance = 0 # 初始化最终结果:最大化的“最近车辆距离”

# 遍历每一个停车位,寻找空位 (0)
for i in range(n):
    if spots[i] == 0: # 如果当前车位是空的
        # 初始化当前空位到最近车辆的最小距离 (用一个很大的数代表无穷远)
        current_spot_min_dist_to_car = float('inf') 

        # 1. 查找左边最近的已停车车辆 (1)
        dist_left = float('inf') # 初始化到左边车的距离为极大值
        for j in range(i - 1, -1, -1): # 从当前空位的左侧开始向左搜索 (range(start, stop, step))
            if spots[j] == 1: # 如果找到一辆车
                dist_left = i - j # 计算距离
                break # 找到最近的即可,停止搜索

        # 2. 查找右边最近的已停车车辆 (1)
        dist_right = float('inf') # 初始化到右边车的距离为极大值
        for j in range(i + 1, n): # 从当前空位的右侧开始向右搜索
            if spots[j] == 1: # 如果找到一辆车
                dist_right = j - i # 计算距离
                break # 找到最近的即可,停止搜索
        
        # 确定当前空位的“最近车辆距离”
        # 由于题目保证至少有一辆车,所以 dist_left 和 dist_right 不会同时为 'inf'
        if dist_left != float('inf') and dist_right != float('inf'):
            # 如果左右两边都有车,取较小的距离
            current_spot_min_dist_to_car = min(dist_left, dist_right)
        elif dist_left != float('inf'):
            # 如果只有左边有车
            current_spot_min_dist_to_car = dist_left
        elif dist_right != float('inf'):
            # 如果只有右边有车
            current_spot_min_dist_to_car = dist_right
        
        # 更新全局的“最大化的最近车辆距离”
        if current_spot_min_dist_to_car > max_overall_min_distance:
            max_overall_min_distance = current_spot_min_dist_to_car

# 输出最终计算得到的最大距离
print(max_overall_min_distance)

七、JavaScript算法源码

// Node.js中用于读取标准输入的模块
const readline = require('readline');

// 创建readline接口实例
const rl = readline.createInterface({
  input: process.stdin,   // 从标准输入读取
  output: process.stdout, // 输出到标准输出 (虽然这里不用它直接输出提示)
  terminal: false         // 表明不是一个 TTY 终端交互,适合管道输入
});

rl.on('line', (line) => { // 当读取到一行输入时触发
    const parts = line.split(','); // 使用逗号作为分隔符,将输入字符串分割成字符串数组
    const n = parts.length; // 获取停车位的总数
    const spots = new Array(n); // 创建一个数组用于存储每个停车位的状态

    // 将字符串数组中的每个元素转换为整数,并存入spots数组
    for (let i = 0; i < n; i++) {
        spots[i] = parseInt(parts[i].trim(), 10); // trim()去除空格, 10表示十进制解析
    }

    let maxOverallMinDistance = 0; // 初始化最终结果:最大化的“最近车辆距离”

    // 遍历每一个停车位,寻找空位 (0)
    for (let i = 0; i < n; i++) {
        if (spots[i] === 0) { // 如果当前车位是空的 (使用 === 进行严格比较)
            let currentSpotMinDistToCar = Infinity; // 初始化当前空位到最近车辆的最小距离

            // 1. 查找左边最近的已停车车辆 (1)
            let distLeft = Infinity; // 初始化到左边车的距离为无穷大
            for (let j = i - 1; j >= 0; j--) { // 从当前空位的左侧开始向左搜索
                if (spots[j] === 1) { // 如果找到一辆车
                    distLeft = i - j; // 计算距离
                    break; // 找到最近的即可,停止搜索
                }
            }

            // 2. 查找右边最近的已停车车辆 (1)
            let distRight = Infinity; // 初始化到右边车的距离为无穷大
            for (let j = i + 1; j < n; j++) { // 从当前空位的右侧开始向右搜索
                if (spots[j] === 1) { // 如果找到一辆车
                    distRight = j - i; // 计算距离
                    break; // 找到最近的即可,停止搜索
                }
            }
            
            // 确定当前空位的“最近车辆距离”
            // 由于题目保证至少有一辆车,所以 distLeft 和 distRight 不会同时为 Infinity
            if (distLeft !== Infinity && distRight !== Infinity) {
                // 如果左右两边都有车,取较小的距离
                currentSpotMinDistToCar = Math.min(distLeft, distRight);
            } else if (distLeft !== Infinity) {
                // 如果只有左边有车
                currentSpotMinDistToCar = distLeft;
            } else if (distRight !== Infinity) {
                // 如果只有右边有车
                currentSpotMinDistToCar = distRight;
            }

            // 更新全局的“最大化的最近车辆距离”
            if (currentSpotMinDistToCar > maxOverallMinDistance) {
                maxOverallMinDistance = currentSpotMinDistToCar;
            }
        }
    }

    console.log(maxOverallMinDistance); // 输出最终计算得到的最大距离
    rl.close(); // 关闭readline接口
});

八、C算法源码

#include <stdio.h>      // 引入标准输入输出库 (printf, fgets, sscanf)
#include <string.h>     // 引入字符串处理库 (strtok, strlen)
#include <stdlib.h>     // 引入标准库 (atoi)
#include <limits.h>     // 引入整型限制库 (INT_MAX)

#define MAX_SPOTS 100    // 定义停车位最大数量

int main() {
    char line[MAX_SPOTS * 2 + 1]; // 输入行缓冲区,考虑到逗号和数字字符,以及末尾的\0
    int spots[MAX_SPOTS];         // 存储停车位状态的数组
    int n = 0;                    // 停车位实际数量

    // 读取一整行输入,fgets 比 scanf("%s", line) 更安全,可以防止缓冲区溢出
    if (fgets(line, sizeof(line), stdin) != NULL) {
        // 移除 fgets 可能读入的换行符
        size_t len = strlen(line);
        if (len > 0 && line[len - 1] == '\n') {
            line[len - 1] = '\0';
        }

        // 使用 strtok 分割字符串
        char *token = strtok(line, ","); // 获取第一个token
        while (token != NULL && n < MAX_SPOTS) { // 循环直到没有token或达到数组上限
            spots[n++] = atoi(token); // 将token转换为整数并存入数组,然后n自增
            token = strtok(NULL, ","); // 获取下一个token
        }
    } else {
        return 1; // 读取失败则退出
    }

    int max_overall_min_distance = 0; // 初始化最终结果:最大化的“最近车辆距离”

    // 遍历每一个停车位,寻找空位 (0)
    for (int i = 0; i < n; i++) {
        if (spots[i] == 0) { // 如果当前车位是空的
            int current_spot_min_dist_to_car = INT_MAX; // 初始化当前空位到最近车辆的最小距离为极大值

            // 1. 查找左边最近的已停车车辆 (1)
            int dist_left = INT_MAX; // 初始化到左边车的距离为极大值
            for (int j = i - 1; j >= 0; j--) { // 从当前空位的左侧开始向左搜索
                if (spots[j] == 1) { // 如果找到一辆车
                    dist_left = i - j; // 计算距离
                    break; // 找到最近的即可,停止搜索
                }
            }

            // 2. 查找右边最近的已停车车辆 (1)
            int dist_right = INT_MAX; // 初始化到右边车的距离为极大值
            for (int j = i + 1; j < n; j++) { // 从当前空位的右侧开始向右搜索
                if (spots[j] == 1) { // 如果找到一辆车
                    dist_right = j - i; // 计算距离
                    break; // 找到最近的即可,停止搜索
                }
            }

            // 确定当前空位的“最近车辆距离”
            // 由于题目保证至少有一辆车,所以 dist_left 和 dist_right 不会同时为 INT_MAX
            if (dist_left != INT_MAX && dist_right != INT_MAX) {
                // 如果左右两边都有车,取较小的距离
                current_spot_min_dist_to_car = (dist_left < dist_right) ? dist_left : dist_right;
            } else if (dist_left != INT_MAX) {
                // 如果只有左边有车
                current_spot_min_dist_to_car = dist_left;
            } else if (dist_right != INT_MAX) {
                // 如果只有右边有车
                current_spot_min_dist_to_car = dist_right;
            }
            
            // 更新全局的“最大化的最近车辆距离”
            if (current_spot_min_dist_to_car > max_overall_min_distance && current_spot_min_dist_to_car != INT_MAX) {
                // 确保 current_spot_min_dist_to_car 被有效赋值过
                max_overall_min_distance = current_spot_min_dist_to_car;
            }
        }
    }

    printf("%d\n", max_overall_min_distance); // 输出最终计算得到的最大距离

    return 0; // 程序正常结束
}

九、C++算法源码

#include <iostream>     // 引入输入输出流库 (std::cin, std::cout)
#include <vector>       // 引入动态数组库 (std::vector)
#include <string>       // 引入字符串库 (std::string)
#include <sstream>      // 引入字符串流库 (std::stringstream)
#include <algorithm>    // 引入算法库 (std::min, std::max)
#include <limits>       // 引入数值极限库 (std::numeric_limits)

int main() {
    std::string line; // 用于存储从控制台读取的一行输入
    std::cin >> line; // 从标准输入读取一行到line变量

    std::vector<int> spots; // 创建一个整型动态数组用于存储停车位状态
    std::stringstream ss(line); // 创建一个字符串流,用输入行初始化
    std::string segment; // 用于存储按逗号分割后的每一小段字符串

    // 使用getline配合stringstream按逗号分割字符串
    while (std::getline(ss, segment, ',')) {
        spots.push_back(std::stoi(segment)); // 将分割出的字符串转换为整数并添加到vector末尾
    }

    int n = spots.size(); // 获取停车位的总数
    int max_overall_min_distance = 0; // 初始化最终结果:最大化的“最近车辆距离”

    // 遍历每一个停车位,寻找空位 (0)
    for (int i = 0; i < n; ++i) { // C++中常用 ++i
        if (spots[i] == 0) { // 如果当前车位是空的
            // 初始化当前空位到最近车辆的最小距离为整型最大值
            int current_spot_min_dist_to_car = std::numeric_limits<int>::max(); 

            // 1. 查找左边最近的已停车车辆 (1)
            int dist_left = std::numeric_limits<int>::max(); // 初始化到左边车的距离为极大值
            for (int j = i - 1; j >= 0; --j) { // 从当前空位的左侧开始向左搜索
                if (spots[j] == 1) { // 如果找到一辆车
                    dist_left = i - j; // 计算距离
                    break; // 找到最近的即可,停止搜索
                }
            }

            // 2. 查找右边最近的已停车车辆 (1)
            int dist_right = std::numeric_limits<int>::max(); // 初始化到右边车的距离为极大值
            for (int j = i + 1; j < n; ++j) { // 从当前空位的右侧开始向右搜索
                if (spots[j] == 1) { // 如果找到一辆车
                    dist_right = j - i; // 计算距离
                    break; // 找到最近的即可,停止搜索
                }
            }

            // 确定当前空位的“最近车辆距离”
            // 由于题目保证至少有一辆车,所以 dist_left 和 dist_right 不会同时为极大值
            bool has_left_car = (dist_left != std::numeric_limits<int>::max());
            bool has_right_car = (dist_right != std::numeric_limits<int>::max());

            if (has_left_car && has_right_car) {
                // 如果左右两边都有车,取较小的距离
                current_spot_min_dist_to_car = std::min(dist_left, dist_right);
            } else if (has_left_car) {
                // 如果只有左边有车
                current_spot_min_dist_to_car = dist_left;
            } else if (has_right_car) {
                // 如果只有右边有车
                current_spot_min_dist_to_car = dist_right;
            }
            // else current_spot_min_dist_to_car 保持极大值, 但这不应发生

            // 更新全局的“最大化的最近车辆距离”
            if (current_spot_min_dist_to_car > max_overall_min_distance && current_spot_min_dist_to_car != std::numeric_limits<int>::max()) {
                // 确保 current_spot_min_dist_to_car 被有效赋值过
                max_overall_min_distance = current_spot_min_dist_to_car;
            }
        }
    }

    std::cout << max_overall_min_distance << std::endl; // 输出最终计算得到的最大距离

    return 0; // 程序正常结束
}



🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2025 B卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

华为OD-2023真题的考点主要为以下几个类: 1. 数据结构与算法:考察对各种常用数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、查找、递归、动态规划等)的理解和应用能力,以及对时间复杂度和空间复杂度的析和优化。 2. 编程语言和语法:考察对编程语言(如C++Python等)的基本语法和特性的掌握程度,包括变量、运算符、控制流程、函数、类等。同时还要求考生熟练运用相关的标准库和常用的数据结构和算法。 3. 网络与操作系统:考察对计算网络和操作系统的基本原理和常用技术的了解,包括网络通信、TCP/IP协议、进程管理、内存管理、文件系统等。要求考生理解并能解决相关的问题。 4. 数据库与SQL:考察对数据库的基本概念和原理的理解,包括数据模型、关系代数、SQL语言等内容。要求考生能够编写和优化SQL查询语句,处理常见的数据库操作和性能问题。 5. 系统设计与架构:考察对大型系统的设计和架构的理解,包括系统需求析、模块划、接口设计等。要求考生能够根据需求或场景提出可行的系统设计方案,并能解决相关的实际问题。 总体来说,华为OD-2023真题的考点比较全面,涵盖了计算科学与技术的多个方面。考生需要具备扎实的数据结构与算法基础,熟悉常用编程语言和标准库的使用,了解网络和操作系统的基本原理,掌握数据库和SQL语言的基本知识,同时具备系统设计和架构的能力。只有在这些方面的基础上才能够应对各种考题,并取得优异的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值