Все возможные значения int от самых маленьких до самых больших с использованием Java - PullRequest
7 голосов
/ 07 мая 2009

Напишите программу для печати всех возможных значений типа данных int от самых маленьких до самых больших с использованием Java.

Некоторые заметные решения по состоянию на 8 мая 2009 г., 10:44 GMT:

1) Дэниел Лью первым опубликовал правильно работающий код .

2) Крис предоставил простейшее решение для данной проблемы.

3) Том Хотин (tackline), возможно, придумал самое элегантное решение .

4) ммайерс отметил, что печать может стать узким местом, и можно улучшить за счет буферизации .

5) Подход Джая к грубой силе примечателен тем, что, помимо определения основной точки программирования, результирующий исходный код занимает около 128 ГБ и нарушает ограничения компилятора.

В качестве дополнительного примечания я считаю, что ответы действительно показывают, что это может быть хорошим вопросом для интервью, если акцент не делается на способности запоминать пустяки о переполнении типа данных и его последствиях (которые можно легко определить во время модульного тестирования), или способ получения пределов MAX и MIN (можно легко найти в документации), а точнее - анализ различных способов решения проблемы.

Ответы [ 14 ]

15 голосов
/ 07 мая 2009
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);
    }
}

Я нанят?

14 голосов
/ 07 мая 2009

Простейшая форма (минимальный код):

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

Нет переполнения целых чисел, никаких дополнительных проверок (просто немного больше памяти, но у кого нет 32 запасных битов)

Пока я полагаю

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

меньше символов, я не могу сказать, что это проще . Короче не обязательно проще, у него меньше кода.

8 голосов
/ 07 мая 2009

Мне просто нужно добавить ответ ...

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);
    }
}
  • Мы не хотим повторения тела (подумайте о техобслуживании!)
  • Он не зацикливается вечно.
  • Используется соответствующий тип для счетчика.
  • Для этого не требуется какая-то дикая сторонняя библиотека чудаков.
4 голосов
/ 08 мая 2009

Ах, и вот я только начал писать

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

Хорошо, просто дайте мне несколько недель, чтобы закончить печатать ...

В инструкциях не говорилось, что я должен использовать цикл, и по крайней мере у этого метода нет проблем с переполнением.

4 голосов
/ 07 мая 2009

Есть что-то хитрое, что я не ловлю? Там, вероятно, есть ... ( edit: Да, есть!)

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);
        }
    }
}

Поскольку печать является узким местом, буфер значительно улучшит скорость (я знаю, потому что я только что попробовал):

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);
    }
}

Кроме того, эта версия фактически прекратит работу (спасибо Даниэлю Лью за то, что он указал, что на самом деле было что-то хитрое, что я не уловил).

Общее время выполнения для этой версии (с параметром -Xmx512m) составило 1:53. Это более 600000 номеров в секунду; совсем неплохо! Но я подозреваю, что это было бы медленнее, если бы я не запускал его свернутым.

3 голосов
/ 07 мая 2009

Другой способ перебрать все значения, используя тип int.

public static void main(String[] args) {
    int i = Integer.MIN_VALUE;
    do {
        System.out.println(i);
    } while (i++ < Integer.MAX_VALUE);
}
3 голосов
/ 07 мая 2009

Давай, ребята, он сказал, используя Java. Это не говорит использовать int в цикле 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 голосов
/ 07 мая 2009

Когда я впервые посмотрел на это, мой первый вопрос был «как вы определяете наименьшее и наибольшее». Для того, что я считал самым очевидным определением («наименьшее» == «ближе всего к 0»), ответом будет

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

Но все остальные, кажется, читают «наименьшее» как «минимальное» и «самое большое» как «максимальное»

2 голосов
/ 08 мая 2009

Принимая во внимание обзор лучших ответов, я понял, что в отделе грубой силы нам очень не хватает. Ответ Джея хорош, но на самом деле это не сработает. Во имя науки я представляю - Бозо Диапазон:

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);
            }
        }
    }
}

Обратите внимание, что для запуска этой программы вам потребуется выделить как минимум 4 ГБ ОЗУ. (Возможно, 8 ГБ, если вы работаете на 64-битной машине, которая вам, вероятно, потребуется для запуска этой программы ...). Этот анализ не учитывает раздувание, которое класс Integer добавляет к какому-либо данному типу int, ни размер самого HashSet.

2 голосов
/ 07 мая 2009

Максимальное значение для int равно Integer.MAX_VALUE, а минимальное - Integer.MIN_VALUE. Используйте цикл, чтобы распечатать все из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...