Encuentra los valores más bajos y segundos más bajos en una matriz de números -- ruby campo con array camp codereview Relacionados El problema

Find the lowest and second lowest values in an array of numbers


3
vote

problema

Español

Tratando de encontrar la forma de hacerlo con solo un pase a través de la matriz, por lo que no correré una especie en ella y no tomaré ARR [0..1]. No estoy seguro de cómo hacer que se vea mejor:

  def LowestSecondLowest(arr)   lowest,second_lowest = nil,nil    arr.each do |n|      if second_lowest.nil?       second_lowest=n     elsif lowest.nil?       if n>second_lowest         lowest=second_lowest         second_lowest=n       elsif n<second_lowest         lowest=n       end     elsif n<lowest       second_lowest=lowest       lowest=n     elsif n>lowest && n<second_lowest       second_lowest=n     end          end    "#{lowest} #{second_lowest}" end   
Original en ingles

Trying to find way to do this with only one pass through the array, so I won't run a sort on it and take arr[0..1]. Not sure how to make it look better:

def LowestSecondLowest(arr)   lowest,second_lowest = nil,nil    arr.each do |n|      if second_lowest.nil?       second_lowest=n     elsif lowest.nil?       if n>second_lowest         lowest=second_lowest         second_lowest=n       elsif n<second_lowest         lowest=n       end     elsif n<lowest       second_lowest=lowest       lowest=n     elsif n>lowest && n<second_lowest       second_lowest=n     end          end    "#{lowest} #{second_lowest}" end 
     
 
 

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Porque import argparse def parse_args(): """Parses command-line arguments.""" parser = argparse.ArgumentParser() parser.add_argument('infile', type=argparse.FileType('r')) parser.add_argument('informat', action='store', choices=HASH_FORMATS) parser.add_argument('outfile', type=argparse.FileType('w')) parser.add_argument('outformat', action='store', choices=HASH_FORMATS) return parser.parse_args() if __name__ == '__main__': args = parse_args() # ... 22 le permite colocar elementos repetidos del mismo valor, creo que los dos elementos más bajos en import argparse def parse_args(): """Parses command-line arguments.""" parser = argparse.ArgumentParser() parser.add_argument('infile', type=argparse.FileType('r')) parser.add_argument('informat', action='store', choices=HASH_FORMATS) parser.add_argument('outfile', type=argparse.FileType('w')) parser.add_argument('outformat', action='store', choices=HASH_FORMATS) return parser.parse_args() if __name__ == '__main__': args = parse_args() # ... 3 son 99887776655443324 , NO import argparse def parse_args(): """Parses command-line arguments.""" parser = argparse.ArgumentParser() parser.add_argument('infile', type=argparse.FileType('r')) parser.add_argument('informat', action='store', choices=HASH_FORMATS) parser.add_argument('outfile', type=argparse.FileType('w')) parser.add_argument('outformat', action='store', choices=HASH_FORMATS) return parser.parse_args() if __name__ == '__main__': args = parse_args() # ... 5 . Este es el mismo comportamiento que se enfrentaría si se enfrentaría a la matriz y obtener los dos primeros elementos. También creo que en import argparse def parse_args(): """Parses command-line arguments.""" parser = argparse.ArgumentParser() parser.add_argument('infile', type=argparse.FileType('r')) parser.add_argument('informat', action='store', choices=HASH_FORMATS) parser.add_argument('outfile', type=argparse.FileType('w')) parser.add_argument('outformat', action='store', choices=HASH_FORMATS) return parser.parse_args() if __name__ == '__main__': args = parse_args() # ... 6 hay un más bajo y no 2º más bajo (también, el mismo comportamiento si está clasificando y obteniendo los dos primeros).

Con esto en mente, cambié su código para obedecer estas instalaciones (y hacerlo un poco más legible si puedo decir). Echar un vistazo.

  import argparse   def parse_args():     """Parses command-line arguments."""      parser = argparse.ArgumentParser()      parser.add_argument('infile', type=argparse.FileType('r'))     parser.add_argument('informat', action='store', choices=HASH_FORMATS)     parser.add_argument('outfile', type=argparse.FileType('w'))     parser.add_argument('outformat', action='store', choices=HASH_FORMATS)      return parser.parse_args()  if __name__ == '__main__':     args = parse_args()     # ... 7  

Si desea probarlo

  import argparse   def parse_args():     """Parses command-line arguments."""      parser = argparse.ArgumentParser()      parser.add_argument('infile', type=argparse.FileType('r'))     parser.add_argument('informat', action='store', choices=HASH_FORMATS)     parser.add_argument('outfile', type=argparse.FileType('w'))     parser.add_argument('outformat', action='store', choices=HASH_FORMATS)      return parser.parse_args()  if __name__ == '__main__':     args = parse_args()     # ... 8  
 

Because Array lets you put repeated elements of same value, I believe that the two lowest elements in [1, 2, 1] are [1, 1], not [1, 2]. This is the very same behavior one would face if sorting the array and getting the two first elements. Also I believe that in [1] there is a lowest and no 2nd lowest (also, the very same behavior if sorting and getting the first two).

With this in mind, I changed your code to obey these premises (and make it a bit more readable if I may say). Take a look.

def two_lowest arr   # if arr has no elements, there is no answer   # If arr has only one element, this is the lowest   if arr.size < 2 then     return arr.first, nil   end    lowest, second_lowest = nil, nil    arr.each do |n|     if lowest.nil? or n < lowest       # if we have no lowest or we found an element lower than current lowest,       # update our lowest and 2nd lowest       second_lowest = lowest       lowest = n     elsif second_lowest.nil? or n < second_lowest       # if we have no 2nd lowest or we found an element between lowest and 2nd       # lowest, update our 2nd lowest       second_lowest = n     end          end    return lowest, second_lowest end 

If you want to test it

tests = [   [],   [1],   [1, 1],   [1 ,2],   [1, 2, 1],   [1, 2, 3],   [1, 1, 2, 3],   [3, 2, 1, 1], ]  for test in tests   puts "In #{test}:"   puts "#{two_lowest test}"   puts end 
 
 
       
       

Relacionados problema

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

2  Cargando imágenes en el fondo para una vista de tabla  ( Loading images in the background for a table view ) 
Tengo fetchData2 MÉTODO QUE LLENA MI imagesArray : func fetchData(){ let imageQuery = PFUser.query() imageQuery?.whereKey("username", contained...

2  Devuelve verdadero si los elementos de una matriz no contienen uno u otro  ( Return true if the elements of an array do not contain one or the other ) 
Estoy completando gradualmente los ejercicios de codificación para Java. Aquí está el uno acabo de hacer: Dada una matriz de INTS, devuelva verdadera si ...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...

6  Clase de matriz multidimensional simple en C ++ 11  ( Simple multi dimensional array class in c11 ) 
La nueva versión del código se puede revisar en Clase de matriz multidimensional simple en C ++ 11 - Seguimiento . El siguiente código implementa una clas...

5  Encuentra el primer número único de la matriz  ( Find first unique number from array ) 
Se me pidió que creara una función que devuelva el primer entero único de la matriz de enteros. En un caso de éxito, la función devuelve el número único en un...

2  Importando datos en Excel  ( Importing data into excel ) 
¿Existe una forma más fácil de importar datos en una matriz de Excel u otra estructura de datos? He intentado investigar colecciones, pero he encontrado la D...

2  Mejora de la función que compara dos cadenas  ( Improving function that compares two strings ) 
Estoy aprendiendo C y he hecho esta función muy simple para comparar dos cuerdas. Me gustaría saber cómo se puede mejorar: int match(char* string1, char* s...

6  Fusionando dos varias de clases  ( Merging two array of classes ) 
Tengo esta función que debe fusionar dos matriz de clases cuando id es igual a id de Array2. Para la simplicidad, convirtí una matriz en un arraylist pa...

6  Buscar número de más en una matriz 2D  ( Find number of plus in a 2d array ) 
Problema Chargrid El CharGrid La clase encapsula una matriz de 2-D con una pareja de operaciones. INT APULUS () Busque un patrón '+' en la cuadrícu...




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