Java — консольные задачи

Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.

Текущая статья посвящена консольным задачам на Java — ввод-вывод, массивы, коллекции и типовые алгоритмы.

Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:

  1. Основы
  2. Система и сеть
  3. Данные и разметка
  4. Код и разработка
  5. Языки
  6. Искусственный интеллект
  7. Проект
  8. Инфраструктура и безопасность
  9. Спин-офф

Обязательно пройдитесь.

А теперь приступим к нашему предмету.

Теория и соседние материалы

Синтаксис и `Scanner` — Основные конструкции.

Циклы и условия — Операторы и циклы.

Коллекции — отдельная глава.

Окна, кнопки и формы на Swing — галерея с построчным разбором (теория — JavaFX и GUI).

Мини-приложения в энциклопедии — Простые приложения.

Серверные сниппеты (NIO, JDBC) — Примеры решений в Java.


Навигация по примерам

Раздел Тема
Каркас программы public static void main java, java hello world
Шаблоны ввода-вывода java scanner пример, java чтение массива, BufferedReader java
Стартовые задачи java сумма двух чисел, fizzbuzz java, найти максимум в массиве java
1. Массивы и списки java массив int, ArrayList java, префиксные суммы java
2. Коллекции и частоты HashMap java пример, HashSet уникальные элементы
3. Сортировка и поиск Arrays.sort java, бинарный поиск java
4. Строки java палиндром, split строка java, StringBuilder
5. Числа НОД java, простое число java, факториал java
6. Меню и цикл программы java меню switch, угадай число java
7. Шпаргалка java вывод массива, несколько тестов java
8. Популярные запросы сумма элементов массива java, reverse string java, bubble sort java, fibonacci java
Частые ошибки scanner nextint nextline, could not find main class

Из чего состоит решение любой задачи

На контрольной, Stepik, Codeforces и в учебнике программа почти всегда устроена одинаково:

  1. Прочитать вход строго по формату из условия.
  2. Посчитать ответ — цикл, массив, HashMap, сортировка…
  3. Вывести ровно то, что просят — без лишних слов «Ответ:» и без лишнего пробела в конце строки.

Достаточно стандартной библиотеки Java: java.util.Scanner, массивы, ArrayList, HashMap, Arrays.sort. Для очень большого ввода (десятки и сотни тысяч чисел) — BufferedReader вместо Scanner.


Обязательный каркас

Любая учебная программа на Java — это класс с методом main. JVM при запуске ищет именно его.

public class Main {
    public static void main(String[] args) {
        // ваш код
    }
}

Разбор сигнатуры main — по словам:

Часть Смысл
public Метод доступен JVM снаружи класса — без этого точку входа не найдут.
static Вызывается без создания объекта класса Main. JVM не делает new Main() перед стартом.
void Метод ничего не возвращает через return наружу (результат — только через System.out).
main Фиксированное имя точки входа.
String[] args Аргументы командной строки: java Main 10 20args[0]="10", args[1]="20". Подробнее — public static void main — точка входа JVM.

Правила файла:

Правило Пояснение
Имя файла = имя public class Файл Hello.javapublic class Hello
Один public class на файл Остальные классы в том же файле — без public
Компиляция javac Hello.java → появляется Hello.class (байт-код)
Запуск java Hello — JVM загружает Hello.class и вызывает main

Минимальный Hello World с разбором:

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}
Строка Что происходит
System Класс из стандартной библиотеки (управление системой).
out Статическое поле — поток стандартного вывода (консоль).
println(..) Печатает строку и переводит курсор на новую строку.
print(..) Печатает без перевода строки — следующий вывод продолжит ту же строку.

Пример:

Запуск: java Hello
Выход: Hello, Java!

Шаблоны ввода-вывода

Четыре шаблона покрывают большинство школьных и курсовых задач на массивы чисел. Выбор шаблона — первый шаг после прочтения условия: смотрите, как именно оформлен вход.

Scanner или BufferedReader?

Scanner BufferedReader
Удобство Проще для новичка: nextInt(), nextLine() Чуть больше кода
Скорость Медленнее на огромном вводе Быстрее — олимпиады, 10⁵+ чисел
Когда брать Лабораторная, Stepik, первый курс Timus, Codeforces, большие тесты

Шаблон A — одно число (Scanner)

Формулировка из учебника: «Дано целое число n. Выведите удвоенное значение».


import java.util.Scanner;

public class DoubleNumber {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(n * 2);
        sc.close();
    }
}

Пример:

Вход:  7
Выход: 14

Разбор построчно:

Строка Смысл
import java.util.Scanner; Подключает класс Scanner из стандартной библиотеки.
Scanner sc = new Scanner(System.in); Создаёт объект, читающий стандартный ввод — клавиатуру или файл при java .. < input.txt.
int n = sc.nextInt(); Читает следующее целое из потока. Пропускает пробелы и переводы строк до числа.
System.out.println(n * 2); Умножает и печатает результат — одна строка, без лишнего текста.
sc.close(); Закрывает поток ввода. В коротких программах можно опустить, в учебнике лучше привыкать закрывать.

Смысл шаблона: минимальная программа «прочитал → посчитал → вывел». Основа для задач «найти квадрат», «проверить чётность одного числа» и т.д.


Шаблон B — массив из n чисел (две строки входа)

Формулировка: «Первая строка — n. Вторая — n целых чисел. Выведите их сумму».

Пример:

Вход:
5
3 1 4 1 5

Выход:
14

Разбор по шагам:

  1. int n = sc.nextInt() — читает 5 с первой строки.
  2. long sum = 0 — накопитель суммы. Тип long, а не int: при больших n и больших числах сумма может переполнить int (максимум ≈ 2·10⁹).
  3. for (int i = 0; i < n; i++) — цикл ровно n раз. i здесь только счётчик итераций, не индекс массива — мы числа сразу складываем.
  4. sum += sc.nextInt() — то же, что sum = sum + sc.nextInt(): прочитали очередное число и добавили к сумме.
  5. println(sum) — одна строка ответа.

Почему не массив? Для одной суммы хранить все элементы не обязательно — экономим память. Если дальше нужен доступ к элементам — см. шаблон с int[] a = new int[n].


Шаблон C — все числа в одной строке

Формулировка: «В одной строке через пробел записаны целые числа. Выведите максимум».

Пример:

Вход: 3 1 4 1 5
Выход: 5

Разбор по шагам:

  1. sc.nextLine() — читает всю строку целиком, включая пробелы между числами.
  2. .trim() — убирает пробелы в начале и конце (если в условии «лишний» пробел).
  3. .split("\\s+") — режет строку по одному или нескольким пробельным символам. \\s в Java — «пробел, таб, перевод строки»; + — «один или больше». В regex обратный слэш пишется как \\.
  4. parts[0], parts[1], … — массив строк. Число "42" — ещё не int.
  5. Integer.parseInt(..) — превращает строку в int. Без этого сравнивать и складывать нельзя.
  6. Цикл с i = 1 — первый элемент уже в max; сравниваем остальные.

Когда какой шаблон:

Формат входа в условии Шаблон
Одно число A
Сначала n, потом n чисел (часто на второй строке) B
Числа в одной строке через пробел, без n C
Очень много данных, лимит по времени жёсткий D

Шаблон D — быстрое чтение (BufferedReader)

Когда нужно: ввод из сотен тысяч чисел; Scanner на таких тестах часто получает Time Limit Exceeded.

Пример: тот же, что у шаблона B — вход 5 и 3 1 4 1 5, выход 14.

Разбор:

Конструкция Зачем
throws IOException Чтение из потока может завершиться ошибкой — Java требует это указать у main.
BufferedReader Читает блоками, а не по одному символу — быстрее на больших файлах.
readLine() Одна строка входа без \n.
StringTokenizer Делит строку на токены (слова) по пробелам — аналог split, но без создания массива строк на каждый шаг.
nextToken() Следующий кусок строки.
Long.parseLong Как parseInt, но для типа long.

Подробнее про оба способа ввода — Основные конструкции языка Java.

Формат вывода на автопроверке

На Stepik, Codeforces, ЕГЭ вывод должен буквально совпадать с образцом: лишний пробел в конце строки, слово `Yes` вместо `YES`, лишняя пустая строка — частая причина «неверный ответ» при правильном алгоритме.

В каждом примере ниже есть блок «Вход / Выход» — сверяйтесь с ним.


Стартовые задачи

Задачи, которые задают на первой лабораторной и на самых простых олимпиадных задачах (уровень «A»). Здесь отрабатываются цикл, условие и работа с остатком от деления.

Сумма двух чисел

Формулировка: «Даны два целых числа в двух строках. Выведите их сумму».

Классическая «первая задача» на любой платформе — Codeforces A, учебник, пробник.


import java.util.Scanner;

public class SumTwoNumbers {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        System.out.println(a + b);
        sc.close();
    }
}

Пример:

Вход:
10
25

Выход:
35

Разбор:

Строка Смысл
sc.nextInt() (первый) Читает 10 — до конца строки или до пробела.
sc.nextInt() (второй) Читает 25 — может быть на той же или следующей строке: Scanner не привязан к «одна строка = одно число».
a + b Обыное арифметическое сложение двух int.

Частая ошибка: читать одной строкой через split, когда в условии числа строго на разных строках и проверяющая система подаёт их именно так — программа «зависнет», ожидая вторую строку. Если в условии «два числа в одной строке через пробел» — тогда split уместен.


Количество чётных в массиве

Формулировка: «Дано n и массив из n чисел. Сколько элементов чётные?»

Пример:

Вход:
4
2 3 4 6

Выход:
3

Разбор:

Элемент Смысл
count = 0 Счётчик — шаблон «инициализировать нулём → в цикле увеличивать».
x % 2 == 0 Остаток от деления на 2. Чётные дают 0: 8 % 2 == 0, нечётные — 1: 7 % 2 == 1.
count++ То же, что count = count + 1.

Пошагово на примере: 2 — чётное, count=1; 3 — нет; 4 — count=2; 6 — count=3.

Смысл задачи: закрепить цикл for и оператор % — они нужны в FizzBuzz, проверке простоты, задачах на делимость.


Максимум и индекс (нумерация с 1)

Формулировка: «Дано n и n чисел. Выведите максимальный элемент и номер его первого вхождения (нумерация с 1)».

В школьных условиях элементы часто нумеруют с 1, а в Java индексы массива с 0 — это главный источник ошибок.

Пример:

Вход:
4
3 9 1 9

Выход:
9 2

Разбор:

Шаг Что происходит
После первого числа best = 3, pos = 1 — первый элемент уже «лидер».
i = 2, число 9 9 > 3best = 9, pos = 2.
i = 3, число 1 1 не больше 9 — не обновляем.
i = 4, число 9 9 > 9 ложно — при > второе девятка не перезапишет позицию.

Если нужен последний максимум: замените > на >= — тогда при равенстве позиция сдвинется вправо.

Смысл задачи: шаблон «текущий лучший + его позиция» — основа для поиска минимума, второго максимума, индекса первого/последнего вхождения.


FizzBuzz до n

Формулировка: «Для каждого числа от 1 до n выведите: если делится на 15 — FizzBuzz, на 3 — Fizz, на 5 — Buzz, иначе само число».

Задача на приоритет условий — популярна на собеседованиях и в учебниках.

Пример (n = 15, фрагмент):

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

Разбор:

Вопрос Ответ
Почему % 15 первым? 15 делится и на 3, и на 5. Если проверить % 3 раньше, число 15 попадёт в Fizz и до FizzBuzz не дойдёт.
Почему i <= n? Нужны числа 1, 2, …, n включительно. При i < n последнее число пропадёт.
else if Как только одно условие сработало, остальные не проверяются — важно для взаимоисключающих веток.

Примеры по темам


1. Массивы и списки

1.1. Массив фиксированной длины — вывод в обратном порядке

Формулировка: «Дано n и массив. Выведите элементы в обратном порядке через пробел».

Пример:

Вход:
5
1 2 3 4 5

Выход:
5 4 3 2 1

Разбор:

Строка Смысл
int[] a = new int[n] Создаёт массив из n ячеек, индексы 0 … n−1. Все элементы по умолчанию 0.
a[i] = sc.nextInt() Заполняем слева направо.
i = n - 1; i >= 0; i-- Цикл назад — от последнего индекса к нулю.
i > 0 ? " " : "" Пробел между числами, но не после последнего — иначе автопроверка может ругаться на trailing space.
println() в конце Перевод строки после всей строки ответа.

Смысл: массив в Java имеет фиксированный размер после new int[n]. Размер n обычно известен из условия — типичный формат ввода на экзамене.


1.2. ArrayList — когда длина заранее неизвестна

Формулировка: «Числа идут до конца файла (EOF). Выведите их в обратном порядке».

Пример:

Вход (файл):
3 1 4 1 5

Выход:
5 1 4 1 3

Разбор:

Конструкция Смысл
ArrayList<> Динамический список — растёт при add, в отличие от int[].
List<Integer> Интерфейс; конкретная реализация — ArrayList. Так пишут в «взрослом» коде.
hasNextInt() true, пока в потоке есть ещё целое — удобно для «не знаем заранее n».
Collections.reverse(list) Разворачивает список на месте — без создания нового.
list.get(i) Элемент по индексу — аналог a[i] для массива.

Массив или ArrayList? Если n в условии есть — чаще int[]. Если «читай, пока есть числа» — ArrayList.


1.3. Префиксные суммы — сумма на отрезке [l, r]

Формулировка: «Дан массив. Ответьте на запрос: сумма элементов с индексами от l до r включительно (индексы с 0)».

Идея: один раз построить массив pref, где pref[i] — сумма a[0] + … + a[i−1]. Тогда сумма на [l, r] за O(1): pref[r + 1] - pref[l].

Пример:

Вход:
5
1 2 3 4 5
1 3

Выход:
9

(элементы с индексами 1, 2, 3 — это 2 + 3 + 4 = 9)

Разбор построения pref на [1, 2, 3, 4, 5]:

i a[i] pref[i+1]
0 1 1
1 2 3
2 3 6
3 4 10
4 5 15

pref[r+1] - pref[l] = pref[4] - pref[1] = 10 - 1 = 9.

Смысл: без префиксов каждый запрос — цикл O(n). С префиксами — O(1) на запрос после O(n) предобработки. Нужно при многих запросах к одному массиву.


2. Коллекции и частоты

2.1. Подсчёт частот слов (HashMap)

Формулировка: «Даны слова через пробел (до конца строки). Для каждого слова выведите, сколько раз оно встретилось».

Пример:

Вход: Java java Code code code

Выход (порядок строк может отличаться):
java: 2
code: 3

Разбор:

Строка Смысл
Map<String, Integer> Словарь: ключ — слово, значение — сколько раз встретилось.
HashMap<> Реализация «хеш-таблица» — поиск и вставка в среднем O(1).
sc.next() Одно слово до пробела (не целая строка — это nextLine).
toLowerCase() «Java» и «java» считаем одним словом.
freq.merge(word, 1, Integer::sum) Если ключа нет — счётчик 0+1; если есть — старое значение + 1.
entrySet() Пара «ключ + значение» для обхода всей карты.

Эквивалент без merge (понятнее новичку):

if (freq.containsKey(word)) {
    freq.put(word, freq.get(word) + 1);
} else {
    freq.put(word, 1);
}

2.2. Сколько различных чисел (HashSet)

Формулировка: «Дано n и n целых. Сколько различных значений?»

Пример:

Вход:
6
1 2 2 3 3 3

Выход:
3

Разбор: Set хранит только уникальные элементы. Повторный add(2) ничего не меняет. size() — количество различных чисел.

HashMap vs HashSet: карта — «ключ → значение» (частота, индекс…). множество — «есть / нет» уникального элемента.


2.3. Есть ли пара с суммой k (Two Sum)

Формулировка: «Даны n, число k и массив. Существуют ли два разных элемента с суммой k? Выведите YES или NO».

Пример:

Вход:
5
9
2 7 1 3 4

Выход:
YES

(пара 2 + 7 = 9)

Разбор логики:

  1. Читаем x = 2. В seen пусто. 9 - 2 = 7 не найден. Кладём 2.
  2. x = 7. seen содержит 2, а 9 - 7 = 2есть → ответ YES.

Смысл: вместо перебора всех пар O(n²) — один проход O(n) с хеш-множеством «что уже видели».


3. Сортировка и поиск

3.1. Сортировка массива по возрастанию

Формулировка: «Дано n и массив. Выведите элементы в отсортированном порядке через пробел».

Пример:

Вход:
5
3 1 4 1 5

Выход:
1 1 3 4 5

Разбор:

Конструкция Смысл
Arrays.sort(a) Сортировка на месте — массив a меняется, новый не создаётся. Сложность O(n log n).
Для ArrayList Collections.sort(list)

Смысл: после сортировки удобно искать медиану, k-й элемент, дубликаты, делать бинарный поиск.


3.2. Бинарный поиск

Формулировка: «Дан массив и число target. Выведите индекс target в отсортированном массиве или −1».

Пример:

Вход:
5
3 1 4 1 5
4

Выход:
3

(после сортировки [1, 1, 3, 4, 5], элемент 4 на индексе 3)

Разбор binarySearch:

Возврат Значение
>= 0 Найден, это индекс элемента.
< 0 Не найден; −(insertionPoint + 1) — куда вставили бы. В задаче выводим −1.

Важно: бинарный поиск работает только на отсортированном массиве. Забыть sort — типичная ошибка.


3.3. K-й по величине элемент

Формулировка: «Дано n, k и массив. Выведите k-й максимальный элемент (1 — самый большой)».

Пример:

Вход:
5
2
3 1 4 1 5

Выход:
4

После сортировки [1, 1, 3, 4, 5]: 1-й max = 5 (a[4]), 2-й max = 4 (a[3] = a[n-k]).


4. Строки

4.1. Палиндром

Формулировка: «Дана строка. Является ли она палиндромом (читается одинаково слева направо и справа налево)? Игнорируйте пробелы и регистр».

Пример:

Вход: А роза упала на лапу Азора
Выход: YES

Разбор:

Строка Смысл
nextLine() Вся строка целиком (с пробелами).
replaceAll("\\s+", "") Убираем все пробельные символы.
toLowerCase() А и а сравниваем одинаково.
charAt(i) Символ на позиции i (индексы с 0).
Два указателя left с начала, right с конца — сходятся к центру за O(n).

4.2. Подсчёт гласных

Формулировка: «Дана строка. Сколько в ней гласных букв (латиница и кириллица)?»

Пример:

Вход: Hello мир
Выход: 3

(e, o — латиница; и — кириллица)

Разбор: indexOf(c) >= 0 — символ найден в строке-наборе гласных. Альтернатива — Set<Character> с гласными.


4.3. Разворот слов в предложении

Формулировка: «Дана фраза из слов через пробел. Выведите слова в обратном порядке».

Пример:

Вход: Java учат на первом курсе
Выход: курсе первом на учат Java

Разбор:

Конструкция Зачем
split("\\s+") Несколько подряд пробелов не дают пустых слов.
StringBuilder Эффективная склейка строк в цикле. s = s + word создавала бы новую строку на каждой итерации.

5. Числа и классика

5.1. НОД — алгоритм Евклида

Формулировка: «Даны два натуральных числа. Найдите их наибольший общий делитель (НОД)».

Пример:

Вход:
48
18

Выход:
6

Разбор цикла:

Шаг a b t = a % b
1 48 18 12
2 18 12 6
3 12 6 0
4 6 0 — стоп

Ответ: 6. Теория — Евклид и классические алгоритмы.


5.2. Простое ли число

Формулировка: «Дано число n. Простое ли оно (делится только на 1 и на себя)? n ≥ 2».

Пример: 17 → YES, 15 → NO (делится на 3).

Разбор: достаточно проверять делители d от 2 до √n. Если n = a · b и оба фактора больше √n, их произведение уже больше n — противоречие.


5.3. Факториал

Формулировка: «Дано n. Выведите n!».

Пример: 5120.

Осторожно с типами:

n Помещается в int?
12! да
13! уже нет — используйте long
21! не помещается в long — нужен BigInteger

6. Интерактивное меню

Полные калькулятор, викторина и работа с файлами — в Простые приложения на Java. Здесь — каркас программы, которая работает, пока пользователь не выберет «выход».

6.1. Меню с switch

Разбор:

Элемент Смысл
while (running) Цикл «пока не вышли» — программа не завершается после одной команды.
nextLine() для меню Читаем всю строку выбора — так проще, чем смешивать nextInt и nextLine.
switch + -> С Java 14 — лаконичные ветки без break (expression switch).
Integer.parseInt Строка "42" → число 42.

Ловушка nextInt + nextLine: после nextInt() в буфере остаётся \n. Следующий nextLine() прочитает пустую строку. В меню надёжнее всё через nextLine() + parseInt.


6.2. Угадай число

Формулировка: «Компьютер загадывает число от 1 до 100. Пользователь угадывает; программа отвечает “больше” / “меньше”».

Разбор:

Строка Смысл
nextInt(1, 101) Случайное от 1 включительно до 101 исключительно — то есть 1…100.
ThreadLocalRandom Рекомендуемый генератор в новом коде (см. Основные конструкции языка Java).
break Выход из бесконечного while (true) при угадывании.

7. Полезные приёмы

7.1. Вывод массива одной строкой через пробел

На экзамене часто просят: «элементы через пробел, без скобок».


import java.util.Arrays;

int[] a = {3, 1, 4, 1, 5};
for (int i = 0; i < a.length; i++) {
    if (i > 0) System.out.print(" ");
    System.out.print(a[i]);
}
System.out.println();

Быстрый вариант (для отладки, не всегда для сдачи):

System.out.println(
    Arrays.toString(a).replace("[", "").replace("]", "").replace(", ", " ")
);

Ошибка: System.out.println(a) напечатает [3, 1, 4, 1, 5] со скобками — формат не совпадёт с условием.


7.2. Несколько тестов в одном запуске

Формулировка: «Первая строка — t (число тестов). Для каждого теста — свой формат входа».

Пример:

Вход:
2
3
1 2 3
2
10 20

Выход:
6
30

Разбор: внешний цикл по testизолированные задачи в одном файле входа. Внутри — тот же шаблон B, что выше.


7.3. Чтение чисел до конца файла (EOF)


import java.util.Scanner;

Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
    int x = sc.nextInt();
    // обработка x — например, sum += x
}
sc.close();

Когда: в условии нет n, числа идут до EOF (типично при java Main < input.txt).


7.4. Форматированный вывод (printf)

double pi = 3.14159265;
System.out.printf("pi = %.2f%n", pi);   // pi = 3.14
System.out.printf("%05d%n", 42);       // 00042
System.out.printf("%d + %d = %d%n", 2, 3, 5);
Спецификатор Смысл
%d целое
%f / %.2f вещественное / два знака после запятой
%s строка
%n перевод строки (кроссплатформенный)
%05d минимум 5 цифр, с ведущими нулями

Полная таблица — Основные конструкции языка Java.


Дополнительные типовые задачи

Задачи, по которым чаще всего приходят из поиска и с форумов («как на Java…»). У каждой — формулировка, код, вход/выход и разбор по строкам.


8.1. Сумма элементов массива

Запрос: java сумма элементов массива, array sum java.

Формулировка: «Дано n, затем n целых. Выведите сумму всех элементов».

Пример:

Вход:
4
10 20 30 40

Выход:
100

Разбор:

Строка Смысл
int[] a = new int[n] Сохраняем числа в массив — пригодится, если потом нужен повторный доступ к элементам.
sum += a[i] Накопление суммы в цикле — тот же шаблон, что в шаблоне B, но с явным массивом.
long sum Защита от переполнения при больших n и больших значениях.

Упрощение без массива: если элементы больше не нужны, достаточно sum += sc.nextInt() в цикле — см. ArraySum выше.


8.2. Среднее арифметическое массива

Запрос: java среднее арифметическое массива, average array java.

Формулировка: «Дано n и n оценок (0–100). Выведите среднее с двумя знаками после запятой».

Пример:

Вход:
3
80 90 100

Выход:
90.00

Разбор:

Строка Смысл
(double) sum / n Приведение типа обязательно: sum / n при двух int дало бы целочисленное деление (270/3=90, но 5/2=2).
printf("%.2f") Ровно два знака после запятой — частый формат в условиях.

Связь с учебным проектом «калькулятор средней оценки» — базовая информатика.


8.3. Минимум в массиве

Запрос: java найти минимум в массиве, min element array java.

Формулировка: «Дано n и массив. Выведите минимальный элемент».

Пример:

Вход:
5
3 9 1 9 0

Выход:
0

Разбор: зеркальная логика к максимуму с индексом — первый элемент сразу в min, дальше сравниваем с <.


8.4. Разворот строки

Запрос: java reverse string, перевернуть строку java.

Формулировка: «Дана строка. Выведите её задом наперёд».

Пример:

Вход: Java
Выход: avaJ

Разбор:

Строка Смысл
i = s.length() - 1 Индекс последнего символа (индексация с 0).
charAt(i) Символ на позиции i; у String нет s[i], как в C.
StringBuilder Склеиваем символы без создания лишних строк — см. Строки в Java.

Короткий вариант (Java 15+): new StringBuilder(s).reversetoString() — для учебника лучше понимать цикл.


8.5. Сортировка пузырьком (Bubble Sort)

Запрос: bubble sort java, сортировка пузырьком java.

Формулировка: «Дано n и массив. Отсортируйте по возрастанию сортировкой пузырьком и выведите».

Пример:

Вход:
5
5 1 4 2 3

Выход:
1 2 3 4 5

Разбор логики:

Идея Пояснение
Внешний цикл i После i проходов «всплывших» максимумов последние i элементов уже на месте.
Внутренний j до n - 1 - i Не сравниваем уже отсортированный хвост.
Обмен через tmp Классический swap двух int без отдельной функции.

Смысл: на практике в Java используют Arrays.sort(a) — см. раздел 3. Пузырёк нужен на контрольных и для понимания O(n²). Теория — Алгоритмы сортировки.


8.6. Линейный поиск

Запрос: linear search java, линейный поиск java.

Формулировка: «Даны n, массив и число x. Выведите индекс первого вхождения x или −1».

Пример:

Вход:
6
3 1 4 1 5 9
4

Выход:
2

Разбор:

Строка Смысл
index = -1 «Не найдено» — договорённость, когда в условии просят −1.
break Останавливаемся на первом совпадении.
Сложность O(n) — просмотрели массив слева направо. На отсортированном массиве быстрее бинарный поиск.

8.7. Числа Фибоначчи до n

Запрос: fibonacci java, последовательность фибоначчи java.

Формулировка: «Дано n (n ≥ 1). Выведите первые n чисел Фибоначчи через пробел: 1 1 2 3 5 …».

Пример:

Вход: 7
Выход: 1 1 2 3 5 8 13

Разбор:

Шаг a b next
i=0 1 1 2
i=1 1 2 3
i=2 2 3 5

Смысл: два переменных хранят «текущее» и «следующее» — итеративный Fibonacci без рекурсии (рекурсия на больших n тормозит и может переполнить стек).


8.8. Количество цифр в числе

Запрос: java количество цифр в числе, count digits java.

Формулировка: «Дано целое неотрицательное число. Сколько в нём цифр?»

Пример:

Вход: 12045
Выход: 5

Разбор:

Строка Смысл
n == 0 → 1 Особый случай: у нуля одна цифра.
n /= 10 Отбрасываем последнюю цифру (целочисленное деление).
while (n > 0) Пока есть цифры — увеличиваем счётчик.

Альтернатива: String.valueOf(n).length() — короче, но на экзамене часто требуют цикл.


8.9. Удалить дубликаты, сохранив порядок

Запрос: java удалить дубликаты из массива, unique elements preserve order.

Формулировка: «Дано n и массив. Выведите уникальные элементы в порядке первого появления через пробел».

Пример:

Вход:
8
1 2 2 3 1 4 3 5

Выход:
1 2 3 4 5

Разбор:

Конструкция Зачем
LinkedHashSet Как HashSet (уникальность), но помнит порядок вставки — см. Коллекции в Java.
HashSet без Linked Порядок вывода мог бы быть произвольным — автопроверка упала бы.

8.10. Подсчёт слов в строке

Запрос: java подсчитать слова в строке, count words java.

Формулировка: «Дана строка из слов через пробел. Сколько слов?»

Пример:

Вход:   Java учат на первом курсе
Выход: 5

Разбор:

Строка Смысл
trim() Убирает пробелы по краям — иначе пустая строка после trim может дать лишнее слово.
isEmpty() Строка из одних пробелов → 0 слов.
split("\\s+") Режет по пробелам; words.length — число слов.

Частые ошибки новичков

Симптом Причина Что делать
Could not find or load main class Запуск не из той папки или имя класса ≠ имя файла java ИмяКласса без .class; проверить public class
Программа «зависла» на вводе Ждёт данные, которых нет в input.txt Сверить формат с условием: nextInt vs nextLine
После nextInt() nextLine() читает пустую строку В буфере остался \n Дополнительный nextLine() или только nextLine + parseInt
ArrayIndexOutOfBoundsException Индекс i вышел за 0 … n-1 Цикл i < n, не i <= n
«Неверный ответ» при верной логике Лишний пробел, Yes vs YES, лишний текст Только то, что в образце вывода
Сумма переполнилась Тип int для больших сумм Использовать long
binarySearch «не находит» Массив не отсортирован Сначала Arrays.sort(a)
Scanner и пустая строка

Классический баг в лабораторных:

int n = sc.nextInt();

String line = sc.nextLine(); // часто "" — съели перевод строки после числа

Решение: после nextInt() вызвать лишний sc.nextLine(), или в меню читать всё через nextLine() и парсить числа вручную — как в разделе 6.


Что дальше

Цель Куда идти
Больше мини-приложений Простые приложения на Java
Задачник с ответами Задачи по Java
Алгоритмы на Python (тот же стиль разбора) Python — ЕГЭ и олимпиадка
Сортировка пузырьком, линейный поиск, Fibonacci раздел 8 этой статьи
REST, JDBC, NIO Примеры решений в Java
Spring и backend Spring Boot

Сохраняйте каждый пример в отдельный файл, запускайте из IDE (Первая программа на Java) или из терминала. Сверяйте вывод с блоком «Вход / Выход» — так быстрее закрепляется связь между кодом и результатом, и проще сдавать автопроверку на курсах.