【算法学习】1603. 设计停车系统(java / c / c++ / python / go / rust)

简介: 请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。请你实现 ParkingSystem 类: ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。 bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 1, 2 和 3 表示。一辆车只能停在 carType 对应尺寸的停车位中。如果没有空车位,请返回 false

1603. 设计停车系统:

请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。

请你实现 ParkingSystem 类:

  • ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。
  • bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 1, 2 和 3 表示。一辆车只能停在 carType 对应尺寸的停车位中。如果没有空车位,请返回 false ,否则将该车停入车位并返回 true 。

样例 1

输入:
  
  ["ParkingSystem", "addCar", "addCar", "addCar", "addCar"]
  [[1, 1, 0], [1], [2], [3], [1]]
  
输出:
  
  [null, true, true, false, false]

解释:

  ParkingSystem parkingSystem = new ParkingSystem(1, 1, 0);
  parkingSystem.addCar(1); // 返回 true ,因为有 1 个空的大车位
  parkingSystem.addCar(2); // 返回 true ,因为有 1 个空的中车位
  parkingSystem.addCar(3); // 返回 false ,因为没有空的小车位
  parkingSystem.addCar(1); // 返回 false ,因为没有空的大车位,唯一一个大车位已经被占据了

提示

  • 0 <= big, medium, small <= 1000
  • carType 取值为 1, 2 或 3
  • 最多会调用 addCar 函数 1000 次

分析

  • 这道算法题其实可以很简单,但是为了追求算法的优化理念,尽量难为了自己一下。
  • 需要对三种车位计数,常规的方式就是三个变量,如果为了扩展性,其实可以用hash表或者数组。
  • 题目已经规定有三种车位,而且每种车位数量不超过1000(210正好够用),所以我们可以用一个int类型(一般都是大于等于32位)变量存储三种车位的数量。
  • 所以二当家的题解重点是一个变量如何利用位运算存储三个数量(这种方式并不一定在任何语言中都能做到优化空间,仅仅是在ac了这道算法题的同时,用一种不一样的思路)。

题解

java

class ParkingSystem {
    private int counter;

    public ParkingSystem(int big, int medium, int small) {
        counter = big | medium << 10 | small << 20;
    }

    public boolean addCar(int carType) {
        // 数量存储的位置
        int bits = (carType - 1) * 10;
        // 当前数量
        int cnt  = (counter >> bits) & 0b1111111111;
        if (cnt > 0) {
            // 数量减少,上面判断了大于0,所以不会造成跨类型借位
            counter -= 1 << bits;
            return true;
        }
        return false;
    }
}

/**
 * Your ParkingSystem object will be instantiated and called as such:
 * ParkingSystem obj = new ParkingSystem(big, medium, small);
 * boolean param_1 = obj.addCar(carType);
 */

c

typedef struct {
    int count;
} ParkingSystem;


ParkingSystem* parkingSystemCreate(int big, int medium, int small) {
    int count = big | medium << 10 | small << 20;
    ParkingSystem *s = (ParkingSystem *) malloc(sizeof(ParkingSystem));
    s->count = count;
    return s;
}

bool parkingSystemAddCar(ParkingSystem* obj, int carType) {
    // 数量存储的位置
    int bits = (carType - 1) * 10;
    // 当前数量
    int cnt = (obj->count >> bits) & 0b1111111111;
    if (cnt > 0) {
        // 数量减少,上面判断了大于0,所以不会造成跨类型借位
        obj->count -= 1 << bits;
        return true;
    }
    return false;
}

void parkingSystemFree(ParkingSystem* obj) {
    free(obj);
}

/**
 * Your ParkingSystem struct will be instantiated and called as such:
 * ParkingSystem* obj = parkingSystemCreate(big, medium, small);
 * bool param_1 = parkingSystemAddCar(obj, carType);
 
 * parkingSystemFree(obj);
*/

c++

class ParkingSystem {
private:
    int counter;
public:
    ParkingSystem(int big, int medium, int small) {
        counter = big | medium << 10 | small << 20;
    }

    bool addCar(int carType) {
        // 数量存储的位置
        int bits = (carType - 1) * 10;
        // 当前数量
        int cnt  = (counter >> bits) & 0b1111111111;
        if (cnt > 0) {
            // 数量减少,上面判断了大于0,所以不会造成跨类型借位
            counter -= 1 << bits;
            return true;
        }
        return false;
    }
};

/**
 * Your ParkingSystem object will be instantiated and called as such:
 * ParkingSystem* obj = new ParkingSystem(big, medium, small);
 * bool param_1 = obj->addCar(carType);
 */

python

class ParkingSystem:

    def __init__(self, big: int, medium: int, small: int):
        self.counter = big | medium << 10 | small << 20

    def addCar(self, carType: int) -> bool:
        # 数量存储的位置
        bits = (carType - 1) * 10
        # 当前数量
        cnt = (self.counter >> bits) & 0b1111111111
        if cnt > 0:
            # 数量减少,上面判断了大于0,所以不会造成跨类型借位
            self.counter -= 1 << bits
            return True
        return False



# Your ParkingSystem object will be instantiated and called as such:
# obj = ParkingSystem(big, medium, small)
# param_1 = obj.addCar(carType)

go

type ParkingSystem struct {
    counter int
}


func Constructor(big int, medium int, small int) ParkingSystem {
    return ParkingSystem{big | medium << 10 | small << 20}
}


func (this *ParkingSystem) AddCar(carType int) bool {
    // 数量存储的位置
    bits := (carType - 1) * 10
    // 当前数量
    cnt  := (this.counter >> bits) & 0b1111111111
    if cnt > 0 {
        // 数量减少,上面判断了大于0,所以不会造成跨类型借位
        this.counter -= 1 << bits
        return true
    }
    return false
}


/**
 * Your ParkingSystem object will be instantiated and called as such:
 * obj := Constructor(big, medium, small);
 * param_1 := obj.AddCar(carType);
 */

rust

struct ParkingSystem {
  counter: i32,
}


/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl ParkingSystem {

  fn new(big: i32, medium: i32, small: i32) -> Self {
    ParkingSystem{counter:big | medium << 10 | small << 20}
  }

  fn add_car(&mut self, car_type: i32) -> bool {
    // 数量存储的位置
    let bits = (car_type - 1) * 10;
    // 当前数量
    let cnt  = (self.counter >> bits) & 0b1111111111;
    if (cnt > 0) {
      // 数量减少,上面判断了大于0,所以不会造成跨类型借位
      self.counter -= 1 << bits;
      return true;
    }
    return false;
  }
}

/**
 * Your ParkingSystem object will be instantiated and called as such:
 * let obj = ParkingSystem::new(big, medium, small);
 * let ret_1: bool = obj.add_car(carType);
 */

在这里插入图片描述


原题传送门:https://leetcode-cn.com/problems/design-parking-system/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
15天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
33 3
|
20天前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
29 4
|
1天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
6天前
|
Java Android开发 C++
Java和C++
Java和C++
24 15
|
4天前
|
安全 程序员 Python
Python学习的自我理解和想法(1)
本篇博客记录了作者跟随B站“黑马程序员”课程学习Python的第一天心得,涵盖了`print()`、`input()`、`if...else`语句、三目运算符以及`for`和`while`循环的基础知识。通过实际编写代码,作者逐步理解并掌握了这些基本概念,为后续深入学习打下了良好基础。文中还特别强调了循环语句的重要性及其应用技巧。
|
1天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
22天前
|
存储 网络协议 IDE
从零起步学习Python编程
从零起步学习Python编程
|
28天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
40 7
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
79 3