Dado un número de habitación, encuentra el piso en el que se encuentra la habitación -- java camp codereview Relacionados El problema

Given a room number, find the floor on which the room lies


8
vote

problema

Español

Me encontré con una pregunta donde tuve que encontrar el piso usando la habitación dada no. Y no dada la estructura de datos para mantener los datos. Lo que sabemos es la distribución de las habitaciones a través de los pisos.

este

He dado a continuación la solución, pero creo que puede romperse como aumenta el número de pisos.

  int queryRoom = 37; int totalFloor = 6;  int currentRm = 0; int floorInQuestion = 1; // staring floor  while (floorInQuestion != totalFloor) {     if (floorInQuestion % 2 != 0) {         currentRm = currentRm + 5;     } else {         currentRm = currentRm + 10;     }     if (queryRoom <= currentRm)         break;     floorInQuestion++; }  System.out.println(floorInQuestion);   
Original en ingles

I came across a question where I had to find the floor by using given room no. And given no data structure to hold the data. What we know is distribution of the rooms across the floors.

this

I have given below solution for it but, I think it may break as number of floors increases.

int queryRoom = 37; int totalFloor = 6;  int currentRm = 0; int floorInQuestion = 1; // staring floor  while (floorInQuestion != totalFloor) {     if (floorInQuestion % 2 != 0) {         currentRm = currentRm + 5;     } else {         currentRm = currentRm + 10;     }     if (queryRoom <= currentRm)         break;     floorInQuestion++; }  System.out.println(floorInQuestion); 
  
 
 

Lista de respuestas

10
 
vote
vote
La mejor respuesta
 

Cuando se presenta con problemas que requieren y se ajustan a los valores de entrada, y un valor de salida establecido, siempre es mejor expresar el problema como una función. En su caso, el problema es: "Dado un número de la sala de entrada, ¿en qué piso está?"

Este tipo de pregunta se puede expresar entonces como una sola función:

  public static int whichFloor(int room) {     .... }   

Esa función es el resultado de un proceso llamado "extracción de funciones", tomando una pieza de lógica y extrayendo solo esa pieza a su propia función.

Esto hace que la lógica del código sea más visible, y también le ayuda a organizar sus pensamientos. También hace que alguna expresión lógica sea más simples (valores de retorno temprano).

Entonces, tomando su código en una función, obtiene:

  System.out.println(whichFloor(37));   

y, ahora implementamos whichFloor como:

  public static int whichFloor(int queryRoom) {     int totalFloor = 6;      int currentRm = 0;     int floorInQuestion = 1; // staring floor      while (floorInQuestion != totalFloor) {         if (floorInQuestion % 2 != 0) {             currentRm = currentRm + 5;         } else {             currentRm = currentRm + 10;         }         if (queryRoom <= currentRm) {             return floorInQuestion;         }         floorInQuestion++;     }     return -1; }   

Hay algunos cambios en esa lógica. Específicamente, tengo:

  • añadido {...} Peticiones en la última condición ...
  • ... que ahora es una declaración 9988776655544335 , y no un break
  • devuelve -1 Si no hay un piso coincidente.

Ahora, que while8 -Estatement debe ser un 9988777665544339 Loop:

  System.out.println(whichFloor(37)); 0  

Ahora, como sistema de bucle, así es como debería haber presentado su solución.

Tenga en cuenta que su lógica es lo suficientemente clara, sus variables están bien nombradas, y la lógica se ve lo suficiente. En general, tu respuesta es buena, y solo necesitaba algunos ajustes.

... pero ... ¿hay una mejor solución que no use el bucle?

Considere el patrón en las habitaciones / pisos ...

Pisos impares tienen 5 habitaciones, incluso los pisos tienen 10 habitaciones. ¿Podemos explotar esto mejor? Bueno, sí, podemos tratar los pisos en parejas y tener 15 habitaciones por par ... y luego averiguar si está en el primero de la pareja, o el segundo. Tenga en cuenta que el uso de las operaciones de la división y el resto funciona mejor como un sistema basado en 0, no un sistema basado en 1 como los valores de entrada, por lo que "mapeamos" cada habitación para tener 1 vez, y cada piso también, así que tratamos la habitación 1 como si fuera la habitación 0, y el piso 1 como si fuera el piso 0, y luego también cambia los resultados después. He nombrado variables basadas en cero con el prefijo System.out.println(whichFloor(37)); 1

  System.out.println(whichFloor(37)); 2  
 

When presented with problems that require and input value set, and an output value set, it's always best to express the problem as a function. In your case, the problem is: "Given an input room number, what floor is it on?"

This type of question can then be expressed as a single function:

public static int whichFloor(int room) {     .... } 

That function is the result of a process called "function extraction", taking a piece of logic, and extracting just that piece in to its own function.

This makes the code logic more visible, and it also helps you to organize your thoughts. It also makes some logic expression more simple (early return values).

So, taking your code in to a function, you get:

System.out.println(whichFloor(37)); 

And, now we implement whichFloor as:

public static int whichFloor(int queryRoom) {     int totalFloor = 6;      int currentRm = 0;     int floorInQuestion = 1; // staring floor      while (floorInQuestion != totalFloor) {         if (floorInQuestion % 2 != 0) {             currentRm = currentRm + 5;         } else {             currentRm = currentRm + 10;         }         if (queryRoom <= currentRm) {             return floorInQuestion;         }         floorInQuestion++;     }     return -1; } 

There are some changes in that logic. Specifically, I have:

  • Added {...} braces on the last condition...
  • ... which is now a return statement, and not a break
  • returns -1 if there's no matching floor.

Now, that while-statement should be a for loop:

public static int whichFloor(int queryRoom) {     int totalFloor = 6;     int currentRm = 0;      for (int floorInQuestion = 1; floorInQuestion != totalFloor, floorInQuestion++) {         if (floorInQuestion % 2 != 0) {             currentRm = currentRm + 5;         } else {             currentRm = currentRm + 10;         }         if (queryRoom <= currentRm) {             return floorInQuestion;         }     }     return -1; } 

Now, as a looping system, that's how you should have presented your solution.

Note that your logic is clear enough, your variables are well named, and the logic looks sound enough. On the whole, your answer is good, and just needed some tweaks.

... but... is there a better solution that does not use looping?

Consider the pattern in the rooms/floors...

Odd floors have 5 rooms, even floors have 10 rooms. Can we exploit this better? Well, yes, we can treat the floors in pairs and have 15 rooms per pair... and then figure out whether it's in the first of the pair, or the second. Note that using division and remainder operations works best as a 0-based system, not a 1-based system like the input values are in, so we "map" each room to be 1 less, and each floor too, so we treat room 1 as if it was room 0, and floor 1 as if it was floor 0, and then shift the results back afterwards too. I have named zero-based variables with the prefix zero...

public static int whichFloor(int queryRoom) {     int zeroRoom = queryRoom - 1;    // convert to zero-based room     int zeroPair = zeroRoom / 15;    // get which 15-room floor-pair the room is in      int zeroOffset = zeroRoom % 15;  // get which room in the pair     int zeroFloor = zeroPair * 2;    // convert the pairs back to floors.     if (zeroOffset >= 5) {         // the room in the pair is in the upper floor of the pair.         zeroFloor += 1;     }      int resultFloor = zeroFloor + 1; // convert back to one-based system.     return resultFloor; } 
 
 
 
 

Relacionados problema

5  Memoria / Performance of Merge Sort Code  ( Memory performance of merge sort code ) 
Escribí un código de tipo de combinación para un poco de bocadillo nocturno. Lo he puesto trabajando, pero solo estaba mirando a aprender si me faltaba algo e...

17  Implementación vectorial (física)  ( Vector physics implementation ) 
Recientemente comencé a aprender Java, y decidí implementar un sistema de vectores básico para otro sistema de partículas que estaba construyendo. join()9 ...

2  Eliminación de un nodo en un árbol de búsqueda binario  ( Deletion of a node in a binary search tree ) 
Estoy buscando ver si mi implementación del método de eliminación / eliminación en un árbol de búsqueda binario es suficiente, legible y se ejecuta en un tiem...

2  Fusionar la implementación de Sort Java  ( Merge sort java implementation ) 
¿Puede alguien revisar mi implementación de tipo de fusión en Java? ¿Es bueno / malo y puede mejorarse más? public class MyMergeSort { private int [] d...

34  Clon a todo color del juego de la vida de Conway, con una GUI decente  ( Full color clone of conways game of life with a decent gui ) 
Escribí esto para aprender Javafx, y como excusa para volver a hacer el juego de la vida. Esta es la gui más compleja que he escrito, así que me gustaría come...

2  Solucionador de rompecabezas de rascacielos en Java [cerrado]  ( Skyscraper puzzle solver in java ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. ¿Quieres ...

6  Encontrar el siguiente palíndromo de una cadena de números  ( Finding the next palindrome of a number string ) 
Aquí está el problema: Un entero positivo se llama palíndromo si su representación en el El sistema decimal es el mismo cuando se lee de izquierda a dere...

1  Compruebe si dos cadenas son permutación entre sí  ( Check if two strings are permutation of each other ) 
private String sort(String word) { char[] content = word.toCharArray(); Arrays.sort(content); return new String(content); } private boolea...

5  Encuentre el próximo número Prime - Control de flujo de los bucles anidados 'para `  ( Find the next prime number flow control of nested for loops ) 
Este código funciona perfectamente, pero me molesta. Tener un bucle etiquetado y anidado Bucle, con un Enumerable<T>.Empty()0 Declaración, y un 9988777665...

8  Simple GCD Utility en Java  ( Simple gcd utility in java ) 
i anteriormente discutido El rendimiento se refiere a diferentes algoritmos GCD. Escribí una simple clase de Java que implementa el algoritmo binario GCD. E...




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