Leetcode 1603. Sistema de estacionamiento de diseño -- ++ campo con object-oriented camp codereview Relacionados El problema

Leetcode 1603. Design Parking System


3
vote

problema

Español

Descripción de la problema :

Diseñar un sistema de estacionamiento para un estacionamiento. El estacionamiento tiene tres tipos de espacios de estacionamiento: grandes, medios y pequeños, con un número fijo de ranuras para cada tamaño.

Implementar la clase de Parkingsystem:

ParkingSystem(int big, int medium, int small) Inicializa el objeto del ParkingSystem Class. El número de ranuras para cada espacio de estacionamiento se da como parte del constructor.

bool addCar(int carType)2 Comprueba si hay un espacio de estacionamiento de carType para el automóvil que quiere ingresar al estacionamiento. carType puede ser de tres tipos: grandes, medianos o pequeños, que están representados por 1, 2 y 3 respectivamente. Un automóvil solo puede estacionarse en una plaza de aparcamiento de su carType . Si no hay espacio disponible, devuelva False, de lo contrario, estacione el automóvil en ese espacio de tamaño y devuelva VERDADERO.

A continuación, es mi código, apreciaría cualquier sugerencia sobre cómo mejorar el código.

  #include <iostream>  class ParkingSystem {      public:     ParkingSystem(int big, int medium, int small) :     m_big_max(big),     m_medium_max(medium),     m_small_max(small),     m_big_curr(0),     m_medium_curr(0),     m_small_curr(0)     {}          bool addCar(int carType) {         if (carType == 1) {             // big car             if (m_big_curr == m_big_max) {                 return false;             } else {                 m_big_curr++;             }         } else if (carType == 2) {             // medium car             if (m_medium_curr == m_medium_max) {                 return false;             } else {                 m_medium_curr++;             }         } else {             // small car             if (m_small_curr == m_small_max) {                 return false;             } else {                 m_small_curr++;             }         }                  return true;     }      private:     int m_big_max;     int m_medium_max;     int m_small_max;          int m_big_curr;     int m_medium_curr;     int m_small_curr;      };  int main() {          ParkingSystem parking_system(1, 1, 0);          std::cout << "parking_system.addCar(1) " << parking_system.addCar(1) << std::endl;     std::cout << "parking_system.addCar(2) " << parking_system.addCar(2) << std::endl;     std::cout << "parking_system.addCar(3) " << parking_system.addCar(3) << std::endl;     std::cout << "parking_system.addCar(1) " << parking_system.addCar(1) << std::endl;           return 0; }   
Original en ingles

Description of the problem:

Design a parking system for a parking lot. The parking lot has three kinds of parking spaces: big, medium, and small, with a fixed number of slots for each size.

Implement the ParkingSystem class:

ParkingSystem(int big, int medium, int small) Initializes object of the ParkingSystem class. The number of slots for each parking space are given as part of the constructor.

bool addCar(int carType) Checks whether there is a parking space of carType for the car that wants to get into the parking lot. carType can be of three kinds: big, medium, or small, which are represented by 1, 2, and 3 respectively. A car can only park in a parking space of its carType. If there is no space available, return false, else park the car in that size space and return true.

Below is my code, I would appreciate any suggestions on how to improve the code.

#include <iostream>  class ParkingSystem {      public:     ParkingSystem(int big, int medium, int small) :     m_big_max(big),     m_medium_max(medium),     m_small_max(small),     m_big_curr(0),     m_medium_curr(0),     m_small_curr(0)     {}          bool addCar(int carType) {         if (carType == 1) {             // big car             if (m_big_curr == m_big_max) {                 return false;             } else {                 m_big_curr++;             }         } else if (carType == 2) {             // medium car             if (m_medium_curr == m_medium_max) {                 return false;             } else {                 m_medium_curr++;             }         } else {             // small car             if (m_small_curr == m_small_max) {                 return false;             } else {                 m_small_curr++;             }         }                  return true;     }      private:     int m_big_max;     int m_medium_max;     int m_small_max;          int m_big_curr;     int m_medium_curr;     int m_small_curr;      };  int main() {          ParkingSystem parking_system(1, 1, 0);          std::cout << "parking_system.addCar(1) " << parking_system.addCar(1) << std::endl;     std::cout << "parking_system.addCar(2) " << parking_system.addCar(2) << std::endl;     std::cout << "parking_system.addCar(3) " << parking_system.addCar(3) << std::endl;     std::cout << "parking_system.addCar(1) " << parking_system.addCar(1) << std::endl;           return 0; } 
     

Lista de respuestas

5
 
vote

Observación

Puede simplificar esto usando matrices.

No necesita dos números para cada tipo (máx. y actual). Simplemente rastree el número de puntos abiertos (por tipo) y cuente hacia abajo.

Si no está utilizando matrices consideran una declaración de conmutación.

Revisión del código:

Prefiero n1 sobre n2 .

Si su n3 no devuelve nada más que n4 al final.
Luego, deje fuera la vuelta. Se agrega automáticamente por el compilador.

Re-Design

  n5  
 

Observation

You can simplify this using arrays.

You don't need two numbers for each type (max and current). Simply track the number of open spots (per type) and count down.

if you are not using arrays consider a switch statement.

Code Review:

Prefer "\n" over std::endl.

If your main() does not return anything but 0 at the end.
Then leave out the return. It is auto added by the compiler.

Re-Design

template<std::size_t typeCount = 3> class ParkingSystem {     int openSlots[typeCount];          public:         template<typename... Args>         ParkingSystem(Args... args)             : openSlots{args...}         {}              bool addCar(int type)         {             if (openSlots[type - 1] == 0) {                 return false;             }             --openSlots[type - 1];             return true;         } };  int main()  {          ParkingSystem parking_system(1, 1, 0);          std::cout         << "parking_system.addCar(1) " << parking_system.addCar(1) << "\n"         << "parking_system.addCar(2) " << parking_system.addCar(2) << "\n"         << "parking_system.addCar(3) " << parking_system.addCar(3) << "\n"         << "parking_system.addCar(1) " << parking_system.addCar(1) << "\n"; } 
 
 
 
 
2
 
vote

Observaciones generales

Si observa su clase de estacionamiento, ve que hay demasiadas variables miembros. La primera forma de mejorar sería tratar de reducir las variables adicionales. Y eso podría hacerse mejorando la lógica del código. Pero antes de entrar en la parte lógica, me gustaría señalar.

Uso enum Para Clarity

  9988776655544331  

Estos se llaman Números de magia
No está claro en cuanto a qué 1 o 2 aquí. A menos que lea la pregunta a fondo, puede confundirse.

La solución es usar un enum .
Enums en C ++

Una enumeración es un tipo definido por el usuario que consta de un conjunto de constantes integrales nombradas que son conocidos como enumeradores.

De esta manera, puede darle un nombre a constantes numéricas, que en este caso son 1, 2 y 3.

La sintaxis se vería como

  enum CarType{ BIG= 1, MEDIUM, SMALL};   

Esto establecerá MEDIUM y SMALL TO 2 y 29 respectivamente. Ahora su declaración si se vea como

  if (cartype == 1) if (cartype == 2) 0  

Seguro que escribe un poco más, pero de esta manera es mucho más claro en cuanto a qué se comprueba la instrucción IF.

La lógica

El código nos pide que realicemos un seguimiento de 3 tipos de automóviles. Por lo tanto, todo lo que realmente necesitamos es 3 variables. Aún mejor, una matriz de tipos de automóviles.

  • Cada vez que agregamos un automóvil, hacemos if (cartype == 1) if (cartype == 2) 1
  • Si ya es 0, eso significa que la plaza de estacionamiento de ese tipo está llena.
  if (cartype == 1) if (cartype == 2) 2  

con una matriz

  99887766555443313  

Dado que usamos una matriz, no necesitaremos usar un 99887766655443314 , ya que no estaremos haciendo ningún cheque
La ventaja que tiene cuando se usa una matriz es que su función 998877666555443315 será ligeramente más pequeña.

Agregar el coche

  • Compruebe si if (cartype == 1) if (cartype == 2) 6 es 0
  • SI ES VERDADERO, RETRENDE FALSO AS HACIENDO EL ESTACIONAMIENTO ES 0
  • si falso, devuelve verdadero y decremento. if (cartype == 1) if (cartype == 2) 7

Implementación.

  if (cartype == 1) if (cartype == 2) 8  

¿Qué está pasando aquí?

Dado que tenemos una matriz, podemos cortar directamente la matriz por if (cartype == 1) if (cartype == 2) 9 y obtener el valor correcto. La razón por la que no es 1020 , pero 11 es porque el conteo se inicia a partir de 0. El 1er elemento de una matriz es 99887776655443322 .

Todo lo que hacemos es verificar si ese valor es 13 . Si no es así, significa que se deja más espacio, y podemos derivar ese valor. Si es así, solo 14 ya que el estacionamiento está lleno.

 

General observations

If you notice your Parking class, you see that there are too many member variables. The first way to improve would be to try to reduce the extra variables. And that could be done by improving the code logic. But before I get into the logic part, I would like to point out.

Use enum for clarity

if (cartype == 1) if (cartype == 2) 

These are called Magic Numbers
It's not clear as to what 1 or 2 here. Unless you read the question thoroughly, it can get confusing.

The solution is to use an enum.
enums in C++

An enumeration is a user-defined type that consists of a set of named integral constants that are known as enumerators.

This way you can give a name to numeric constants, which in this case are 1, 2, and 3.

The syntax would look like

enum CarType{ BIG= 1, MEDIUM, SMALL}; 

This will set MEDIUM and SMALL to 2 and 3 respectively. Now your if statement will look like

if (cartype == BIG) if (cartype == MEDIUM) 

Sure you type a little more, but this way it is much clearer as to what the if statement checks for.

The Logic

The code asks us to keep track of 3 types of cars. Hence, all we really need is 3 variables. Even better, an array of car types.

  • Every time we add a car, we do --car_type
  • If it is already 0, that means that the parking space of that type is full.
enum CarType{BIG = 1, MEDIUM, SMALL};  constexpr int nb_car_type = 3;  class Parking{     private:         int m_Big;         int m_Medium;         int m_Small;      public:         Parking(int big,int medium,int small)             : m_Big{big}, m_Medium{medium}, m_Small{small}         {}  }; 

With an array

#include <iostream> #include <array>  constexpr int nb_car_type = 3;  class Parking{     private:         std::array< int , nb_car_type > space;      public:         Parking(int big,int medium,int small)             : space{big,medium,small}         {}  }; 

Since we use an array, we will not need to use an enum since we won't be making any checks
The advantage you have when using an array is that your addcar() function will be slightly smaller.

Adding the car

  • Check whether space[car_type] is 0
  • If true, return false as parking space is 0
  • If false, return true and decrement. --space[car_type]

Implementation.

#include <iostream> #include <array>   constexpr int nb_car_type = 3;  class Parking{     private:         std::array< int , nb_car_type > space;      public:         Parking(int big,int medium,int small)             : space{big,medium,small}         {}         bool addcar(int type)         {             if (space[type-1] == 0)              {                 return false;             }             --space[type-1];             return true;         }  }; 

What's happening here?

Since we have an array, we can directly slice the array by type and get the correct value. The reason it is not type, but type-1 is because counting starts from 0. The 1st element of an array is array[0].

All we do is check whether that value is 0. If it isn't that means more space is left, and we can derement that value. If it is then just return false as parking is full.

 
 

Relacionados problema

5  Solicitud de Tkinter para administrar las tareas escolares  ( Tkinter application to manage school tasks ) 
Soy un principiante en la programación de la OOP y me pregunto cuál es la mejor manera de poner todas las ventanas y funciones de una aplicación de ventana en...

8  Envoltura Libusb Library en C ++  ( Wrapping libusb library in c ) 
Quiero usar la biblioteca de Libusb en mi aplicación C ++. He creado clases que envuelven las funciones de Libusb. Puede ver que la API de Libusb se divide en...

1  Clase de juego, escrito usando enums  ( Playing card class written using enums ) 
Escribí una clase de tarjeta A Mientras vuelvas a esta publicación aquí: Pregunta previa Sé que ha pasado mucho tiempo, pero recientemente regresé al proyec...

8  Árbol fractal orientado a objetos  ( Object oriented fractal tree ) 
Hice un árbol fractal orientado a objetos en JavaScript utilizando la biblioteca P5, consta de tres archivos: fraternal tree.js sucursal.js flower.js ...

5  ¿Podría mejorarse este sistema de profundidad para un juego?  ( Could this depth system for a game be improved ) 
Todavía soy nuevo en C ++ y no tengo una gran idea de mi codificación, así que estaría muy agradecido a cualquiera y todos los que le otorgan consejos. Ade...

10  "Stardust" Simulador 2D Gravity - Seguimiento 1: Los planetas  ( Stardust 2d gravity simulator follow up 1 the planets ) 
Este es un seguimiento para el juego de gravedad del simulador 2D pregunta. Desde entonces, he desarrollado mis habilidades de JavaScript, y ahora esto...

1  Pasando un objeto a la vista en CodeIgner  ( Passing an object to the view in codeigniter ) 
Estoy tratando de usar un objeto y persistirlo en la base de datos. He creado una clase en la carpeta de la biblioteca. <?php if (!defined('BASEPATH'))...

0  Creación de múltiples objetos del extracto de SQL Server  ( Creating multiple objects from sql server extract ) 
He creado una solución prototipo simplificada como una especie de prueba de concepto antes de comenzar un programa más grande. Aquí están los datos de prueb...

3  General Pathfinder en Python  ( General pathfinder in python ) 
Recientemente trabajé en un proyecto donde tuve la siguiente configuración: $_{456}$6 Ninguno del Código es relevante, no tendrá que poder ejecutar nada...

6  Objetos de Java para un programa de sniffer de red  ( Java objects for a network sniffer program ) 
Estoy trabajando en un programa de sniffer de red, cuya estructura utiliza 3 clases principales: clase de marco - uno por marco monitoreado, sostiene la re...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos