2009-05-07 21 views
7

Escriba un programa para imprimir todos los valores posibles de tipo de datos int desde el más pequeño hasta el más grande, usando Java.Todos los valores posibles de int desde el más pequeño hasta el más grande, usando Java

Algunas soluciones notables como del 8 de mayo de 2009, 10:44 GMT:

1) Daniel Lew fue el primero en publicar correctly working code.

2) Kris ha proporcionado the simplest solution para el problema dado.

3) Tom Hawtin - tachado, se le ocurrió con the most elegant solution.

4) mmyers señaló que la impresión es probable que se convierta en un cuello de botella y can be improved through buffering.

5) Jay's brute force approach es notable ya que, además de desafiar el punto central de la programación, el código fuente resultante toma alrededor de 128 GB y socavará los límites del compilador.

Como nota al margen, creo que las respuestas demuestran que podría ser una buena pregunta para una entrevista, siempre y cuando no se haga hincapié en la capacidad de recordar trivialidades sobre el desbordamiento del tipo de datos y sus implicaciones (que pueden ser fácilmente detectados durante la prueba unitaria), o la forma de obtener los límites MAX y MIN (se puede buscar fácilmente en la documentación), sino más bien en el análisis de varias formas de abordar el problema.

+3

¿Fue esta una pregunta real de la entrevista? Que horrible. Odio las preguntas inútiles de la entrevista. Los miraría seriamente y diría "¿por qué alguien escribiría eso?". – jcollum

+0

No hay forma de que esta sea una pregunta de entrevista real. Nadie en su sano juicio preguntaría esto en una entrevista. –

+4

Algunas empresas usan preguntas como esta como una pregunta rápida de eliminación. Por lo general, es por teléfono, pero ocasionalmente obtendrá uno cara a cara. No se sorprenda tanto, las preguntas se vuelven más difíciles. –

Respuesta

2

El valor máximo para int es Integer.MAX_VALUE y el mínimo es Integer.MIN_VALUE. Use un bucle para imprimirlos todos.

+3

Eso son 2 oraciones en inglés, no un programa de Java. :-) – Ken

14
class Test { 
    public static void main(String[] args) { 
     for (int a = Integer.MIN_VALUE; a < Integer.MAX_VALUE; a++) { 
      System.out.println(a); 
     } 
     System.out.println(Integer.MAX_VALUE); 
    } 
} 

¿Se me contrata?

+0

No lo haría,;) solo porque tiene una línea adicional sin ningún motivo. ¿Por qué no solo: for (int a = Integer.MIN_VALUE; a <= Integer.MAX_VALUE; a ++) { System.out.println (a); } –

+6

No, no ha comentado su código :) – Valerion

+10

Si no agrega esa última línea, su bucle nunca terminará. Usando su método, cuando a == Integer.MAX_VALUE, lo imprimirá, incrementará a, y de repente a será Integer.MIN_VALUE. –

4

¿Hay algo complicado que no estoy captando? Probablemente es ... (edición: sí, existe!)

class AllInts { 
    public static void main(String[] args) { 
     // wrong -- i <= Integer.MAX_VALUE will never be false, since 
     // incrementing Integer.MAX_VALUE overflows to Integer.MIN_VALUE. 
     for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) { 
      System.out.println(i); 
     } 
    } 
} 

Dado que la impresión es el cuello de botella, un buffer mejoraría la velocidad mucho (lo sé porque yo sólo probé):

class AllInts { 
    public static void main(String[] args) { 
     // a rather large cache; I did no calculations to optimize the cache 
     // size, but adding the first group of numbers will make the buffer 
     // as large as it will ever need to be. 
     StringBuilder buffer = new StringBuilder(10000000); 
     int counter = 0; 
     // note that termination check is now < 
     // this means Integer.MAX_VALUE won't be printed in the loop 
     for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { 
      buffer.append(i).append('\n'); 
      if (++counter > 5000000) { 
       System.out.print(buffer); 
       buffer.delete(0, buffer.length()-1); 
       counter = 0; 
      } 
     } 
     // take care of the last value (also means we don't have to check 
     // if the buffer is empty before printing it) 
     buffer.append(Integer.MAX_VALUE); 
     System.out.println(buffer); 
    } 
} 

Además, esta versión realmente terminar (gracias a Daniel Lew para señalando que no era, de hecho, algo complicado que no estaba coger).

El tiempo total de ejecución para esta versión (ejecutado con -Xmx512m) fue 1:53. Eso es más de 600000 números/segundo; ¡No está mal! Pero sospecho que hubiera sido más lento si no lo hubiera minimizado.

+5

Su bucle nunca terminará. –

+2

Java está sujeto a un desbordamiento de enteros, por lo que cuando i == Integer.MAX_VALUE, se incrementará en uno y se desbordará en Integer.MIN_VALUE –

+0

No estoy seguro si dar un voto positivo ... –

1

El paquete fj es de here.

import static fj.pre.Show.intShow; 
import static fj.pre.Show.unlineShow; 
import static fj.data.Stream.range; 
import static java.lang.Integer.MIN_VALUE; 
import static java.lang.Integer.MAX_VALUE; 

public class ShowInts 
    {public static void main(final String[] args) 
    {unlineShow(intShow).println(range(MIN_VALUE, MAX_VALUE + 1L));}} 
+1

Demasiado trabajo, e incluye bibliotecas adicionales. – cdeszaq

+0

http://en.wikipedia.org/wiki/Not_Invented_Here – Apocalisp

+0

Claro, pero ¿por qué agregaría una dependencia adicional a algo tan trivial como esto? –

0

En 1000 líneas/seg., Estará listo en aproximadamente 7 semanas. ¿Deberíamos tomar café ahora?

+0

Eso no es un problema. debería producir resultados más rápido de lo que puede leerlo. Que te diviertas. –

+0

En realidad, está más cerca de 10000 líneas/seg (al menos con almacenamiento en búfer). Eso es alrededor de 5 días. : D –

+0

El tiempo real fue de aproximadamente 2 1/2 horas con salida en búfer.Eso es más como 4 o 500000 líneas/seg. Tal vez fue más rápido porque fue minimizado. –

14

forma más simple (código mínimo):

for (long i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) { 
     System.out.println(i); 
    } 

Sin desbordamiento de entero, no cheques adicionales (sólo un poco más el uso de memoria, pero que no tiene 32 bits de reserva por ahí).

Aunque supongo

for (long i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) 
     System.out.println(i); 

tiene menos caracteres, en realidad no puedo decir que es más simple . Más corto no es necesariamente más simple, aunque tiene menos código.

+0

Nunca terminará (ver respuestas anteriores). –

+0

que es un bucle infinito – TStamper

+1

Bien hecho. 32 bits no es nada, especialmente en una arquitectura de 64 bits donde, dependiendo de la máquina virtual, solo desperdiciará más memoria. – cdeszaq

0

Sólo la mejora de las StringBuilder 's se acercan un poco:

2 hilos + 2 buffers (es decir StringBuilder): La idea principal es que un hilo se llena una memoria intermedia, mientras que el otro hilo vuelca el contenido de la otra memoria intermedia.

Obviamente, el subproceso "volcado" será siempre ejecute más lento que el subproceso "relleno".

+0

¿Qué sucede cuando se queda sin memoria? Pausa el hilo "relleno"? –

+0

Sin memoria? No he especificado el tamaño de los búferes, los parámetros -Xms ... Creo que 2 búferes con caracteres de 16 bits de ancho, algunos huecos internos y búferes ... Espero que 'nuevo StringBuilder (15 * 1024 * 1024)' sea una opción segura para una máquina virtual de 64 MB (¿predeterminada?) sin tener OOM. – ATorras

8

Sólo tengo que añadir una respuesta ...

public class PrintInts { 
    public static void main(String[] args) { 
     int i = Integer.MIN_VALUE; 
     do { 
      System.out.println(i); 
      ++i; 
     } while (i != Integer.MIN_VALUE); 
    } 
} 
  • No queremos que el cuerpo repetida (pensar en el mantenimiento!)
  • No hace un bucle infinito.
  • Utiliza un tipo apropiado para el contador.
  • No requiere una biblioteca de weirdo de terceros.
3

Cuando lo vi por primera vez, mi primera pregunta fue '¿cómo se define la más pequeña y la más grande'? Por lo que yo pensaba que era la definición más obvia ('más pequeño' == 'más cercano a 0') la respuesta sería

for (int i = 0; i >= 0; i++) { 
    System.out.println(i); 
    System.out.println(-i-1); 
} 

Pero todo el mundo parece leer 'más pequeño' como 'mínimo' y 'grande' como 'máximo'

+0

Leí la pregunta de la misma manera. Integer.MIN_VALUE no es un número pequeño, es un número negativo muy grande. –

3

Vamos gente, que dijo que el uso de java. No dijo usar un int en el ciclo for. :-)

public class Silly { 
    public static void main(String[] args) { 
    for (long x = Integer.MIN_VALUE; x <= Integer.MAX_VALUE; x++) { 
     System.out.println(x); 
    } 
    } 
} 
3

Otra forma de recorrer todos los valores usando un tipo int.

public static void main(String[] args) { 
    int i = Integer.MIN_VALUE; 
    do { 
     System.out.println(i); 
    } while (i++ < Integer.MAX_VALUE); 
} 
+1

Hábilmente hecho. +1 –

4

Ah, y aquí solo había comenzado a escribir

System.out.println(-2147483648); 
System.out.println(-2147483647); 
System.out.println(-2147483646); 

bien, sólo dame un par de semanas para terminar de escribir esto ...

Las instrucciones no he dicho que tiene que usar un bucle, y al menos este método no tiene ningún problema de desbordamiento.

+2

¡Escribe un programa para escribir ese programa para ti! –

+1

Obtendrá ca ca 128 GB de código fuente. –

+1

@Totophil: Pero mi empresa mide la productividad por líneas de código. Para cuando termine este programa, seré el número 1 en el departamento. – Jay

2

Dada la visión general de las mejores respuestas, me di cuenta de que estamos seriamente escaso en el departamento de fuerza bruta. La respuesta de Jay es agradable, pero en realidad no funcionará. En nombre de la ciencia, presento - Bozo Rango:

import java.util.Random; 
import java.util.HashSet; 

class Test { 
    public static void main(String[] args) { 
     Random rand = new Random(); 
     HashSet<Integer> found = new HashSet<Integer>(); 
     long range = Math.abs(Integer.MAX_VALUE - (long) Integer.MIN_VALUE); 
     while (found.size() < range) { 
      int n = rand.nextInt(); 
      if (!found.contains(n)) { 
       found.add(n); 
       System.out.println(n); 
      } 
     } 
    } 
} 

Tenga en cuenta que tendrá que dejar de lado al menos 4 GB de RAM para ejecutar este programa. (Posiblemente 8 GB, si está en una máquina de 64 bits, que probablemente necesitará para ejecutar este programa ...). Este análisis no cuenta la saturación que la clase Integer agrega a ningún int dado, tampoco, ni el tamaño del propio HashSet.

+0

Upvoted por pura diversión en él. Uno de los beneficios clave que veo detrás de este enfoque es el uso de la biblioteca de colecciones estándar, lo que significa, por ejemplo, que puede ordenar los números fácilmente si tuviera que hacerlo antes de enviarlos ... –

+0

Me falta algo, o no puedo los archivos de paginación se utilizan para permitir que tenga menos de 4 GB de RAM? –

Cuestiones relacionadas