(B卷,100分)- 找车位(Java & JS & Python & C)

题目描述

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

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

输入描述

  1. 一个用半角逗号分割的停车标识字符串,停车标识为0或1,0为空位,1为已停车。
  2. 停车位最多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

评论0

站点公告

没有账号?注册  忘记密码?