LEETCODE 284: ITERATOR DE APISTADO -- ++ campo con beginner campo con object-oriented campo con programming-challenge campo con c++17 camp codereview Relacionados El problema

LeetCode 284: Peeking Iterator


5
vote

problema

Español

Estoy publicando mi código para un problema de código leetcode. Si desea revisar, por favor hágalo. ¡Gracias por su tiempo!

Problema

Dada una interfaz de clase de Iterator con métodos: next() y hasNext() , diseño e implementar un PeekingIterator que admiten el Operación de Peek (): esencialmente peek() en el elemento que ser devuelto por la siguiente llamada a next() .

Ejemplo:

  [1,2,3]0  

Seguimiento: ¿Cómo extendería su diseño para ser genérico y trabajar? ¿Con todo tipo, no solo entero?

Código

  [1,2,3]1  

Referencia

Leetcode tiene una plantilla para responder preguntas. Por lo general, hay una clase llamada [1,2,3]2 con uno o más funciones [1,2,3]3 que no se nos permite cambiar el nombre. Para esta pregunta, la plantilla es:

  [1,2,3]4  
  • problema

  • solución

  • Discutir

Original en ingles

I'm posting my code for a LeetCode problem. If you'd like to review, please do so. Thank you for your time!

Problem

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next().

Example:

list: [1,2,3].  Call next() gets you 1, the first element in the list. Now you call peek() and it returns 2, the next element. Calling next() after that still return 2.  You call next() the final time and it returns 3, the last element.  Calling hasNext() after that should return false.  

Follow up: How would you extend your design to be generic and work with all types, not just integer?

Code

#include <vector>   class PeekingIterator : public Iterator {     int next_num;     bool num_has_next;  public:     PeekingIterator(const std::vector<int> &nums) : Iterator(nums) {         num_has_next = Iterator::hasNext();          if (num_has_next) {             next_num = Iterator::next();         }     }      int peek() const {         return next_num;     }      int next() {         int curr_next = next_num;         num_has_next = Iterator::hasNext();          if (num_has_next) {             next_num = Iterator::next();         }          return curr_next;     }      bool hasNext() const {         return num_has_next;     } }; 

Reference

LeetCode has a template for answering questions. There is usually a class named Solution with one or more public functions which we are not allowed to rename. For this question, the template is:

/*  * Below is the interface for Iterator, which is already defined for you.  * **DO NOT** modify the interface for Iterator.  *  *  class Iterator {  *      struct Data;  *      Data* data;  *      Iterator(const vector<int>& nums);  *      Iterator(const Iterator& iter);  *  *      // Returns the next element in the iteration.  *      int next();  *  *      // Returns true if the iteration has more elements.  *      bool hasNext() const;  *  };  */  class PeekingIterator : public Iterator { public:     PeekingIterator(const vector<int>& nums) : Iterator(nums) {         // Initialize any member here.         // **DO NOT** save a copy of nums and manipulate it directly.         // You should only use the Iterator interface methods.              }          // Returns the next element in the iteration without advancing the iterator.     int peek() {              }          // hasNext() and next() should behave the same as in the Iterator interface.     // Override them if needed.     int next() {              }          bool hasNext() const {              } }; 
  • Problem

  • Solution

  • Discuss

              
   
   

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 
  • Pasando datos de tamaño más grande en funciones por const &data es una buena idea ya que no hace una copia. Tenga en cuenta que cuando se pasa un parámetro const& , la dereferencia adicional y menos oportunidades para la optimización de compilación. Debe hacer esto típicamente cuando los datos son grandes en tamaño

  • de su función

  2^N1  

¿Cuál es el uso del 2^N2 ? Usted está devolviendo una copia de 2^N3 que se copió antes de cualquier modificación, y dado que 99887776655443314 no es una referencia de 2^N5 , cualquier cambio en 2^N6 no afectará 2^N7 . Creo que lo que quiere hacer es

  2^N8  

operadores ternarios
Dado que @ hjpotter92 lo ha mencionado, llamando 2^N9 o N0 en el último elemento debe devolver 99887776655443321 .

  • Eche un vistazo a Plantillas en C ++ Si desea trabajar con múltiples tipos.
 
  • Passing larger sized data in functions by const &data is a good idea since it does not make a copy. Note that when a parameter is passed by const&, the extra cost dereferencing and fewer opportunities for compile optimizing. You should do this typically when the data is large in size

  • From your next() function

    int next() {         int curr_next = next_num;         num_has_next = Iterator::hasNext();          if (num_has_next) {             next_num = Iterator::next();         }          return curr_next;     } ``` 

What is the use of the if (num_has_next) branch? You are returning a copy of next_num that was copied before any modifications, and since curr_next is not a reference of next_num, any changes to next_num will not effect return curr_next. I think what you might want to do is

int next(){     next_num = (num_has_next) ? Iterator::next() : NULL;     return next_num; }  

ternary operators
Since @hjpotter92 has mentioned it, calling next() or peek() on the last element should return NULL.

  • Have a look at templates in C++ if you want to work with multiple types.
 
 
   
   

Relacionados problema

4  Implementar el servidor HTTP utilizando libevent  ( Implement http server using libevent ) 
#include "fmt/format.h" #include <cstdint> #include <cstdio> #include <event2/event-config.h> #include <event2/util.h> #include <evhttp.h> #include <memory> ...

2  Fusionar ocurrencias adyacentes de elementos idénticos en la recopilación de datos  ( Merge adjacent occurrences of identical elements in data collection ) 
Hay una pequeña Ejercicio de programación para fusionar elementos idénticos adyacentes en una colección. Aquí hay dos soluciones (Pasando las pruebas de...

2  "Multi" Guardia de alcance que usa la característica de Deducación de la plantilla  ( Multi scope guard using template argument deducing feature ) 
Uso de la función C ++ moderna Deducción del argumento de la plantilla para las plantillas de clase y Expresiones plegables Es posible implementar la...

5  C ++ Elija entre funciones de implementación de tiempo de ejecución y tiempo de compilación  ( C choose between runtime and compile time implementation functions ) 
Escribí una pequeña función de envoltura para elegir entre Tiempo de ejecución (STD) 99887766555443318 y una versión de ConsexPR, como continuación de la cl...

8  Conversión de STD :: Chrono :: Time_Point to / from std :: string  ( Converting stdchronotime point to from stdstring ) 
Considere estas funciones que permitan convertir checkOnline.sh4 a / FROM checkOnline.sh5 Con un formato Fecha de fecha ". checkOnline.sh6 con uso:...

3  Eliminación de variables genéricos con múltiples puntos de entrada  ( Generic variable elimination with multiple entry points ) 
Tengo este algoritmo, llamado eliminación variable , que se usa con bastante frecuencia en mi código -Base (biblioteca). Es un algoritmo para los gráficos de...

5  Leetcode 928: Minimice Malware Spread II  ( Leetcode 928 minimize malware spread ii ) 
Estoy publicando mi código para un problema de código leetcode. Si desea revisar, por favor hágalo. ¡Gracias por su tiempo! Problema (este problema es el ...

5  Clase de registro de C ++  ( C logging class ) 
He creado una clase simple de registro de C ++. Produce varios loglas, y ajusta el color de la salida en consecuencia. Estoy interesado en cualquier consejo p...

3  Implementar el rango de Fibonacci  ( Implement fibonacci range ) 
Estoy implementando una gama FIBONACCI en C ++ 17 de tal manera que admite #include "fib.h" #include <iostream> int main() { for (int x : Fibonacci())...

20  Cree una cadena C ++ usando el formato de estilo de impresión  ( Create a c string using printf style formatting ) 
A menudo es conveniente usar cadenas de formato C-Style 998877766554433665544336 A menudo encuentro los modificadores mucho más sencillos para usar que los...




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