Java — консольные задачи
Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.
Текущая статья посвящена консольным задачам на Java — ввод-вывод, массивы, коллекции и типовые алгоритмы.
Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:
- Основы
- Система и сеть
- Данные и разметка
- Код и разработка
- Языки
- Искусственный интеллект
- Проект
- Инфраструктура и безопасность
- Спин-офф
Обязательно пройдитесь.
А теперь приступим к нашему предмету.
Синтаксис и `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 и в учебнике программа почти всегда устроена одинаково:
- Прочитать вход строго по формату из условия.
- Посчитать ответ — цикл, массив,
HashMap, сортировка… - Вывести ровно то, что просят — без лишних слов «Ответ:» и без лишнего пробела в конце строки.
Достаточно стандартной библиотеки 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 20 → args[0]="10", args[1]="20". Подробнее — public static void main — точка входа JVM. |
Правила файла:
| Правило | Пояснение |
|---|---|
Имя файла = имя public class |
Файл Hello.java → public 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
Разбор по шагам:
int n = sc.nextInt()— читает5с первой строки.long sum = 0— накопитель суммы. Типlong, а неint: при большихnи больших числах сумма может переполнитьint(максимум ≈ 2·10⁹).for (int i = 0; i < n; i++)— цикл ровноnраз.iздесь только счётчик итераций, не индекс массива — мы числа сразу складываем.sum += sc.nextInt()— то же, чтоsum = sum + sc.nextInt(): прочитали очередное число и добавили к сумме.println(sum)— одна строка ответа.
Почему не массив? Для одной суммы хранить все элементы не обязательно — экономим память. Если дальше нужен доступ к элементам — см. шаблон с int[] a = new int[n].
Шаблон C — все числа в одной строке
Формулировка: «В одной строке через пробел записаны целые числа. Выведите максимум».
Пример:
Вход: 3 1 4 1 5
Выход: 5
Разбор по шагам:
sc.nextLine()— читает всю строку целиком, включая пробелы между числами..trim()— убирает пробелы в начале и конце (если в условии «лишний» пробел)..split("\\s+")— режет строку по одному или нескольким пробельным символам.\\sв Java — «пробел, таб, перевод строки»;+— «один или больше». В regex обратный слэш пишется как\\.parts[0],parts[1], … — массив строк. Число"42"— ещё неint.Integer.parseInt(..)— превращает строку вint. Без этого сравнивать и складывать нельзя.- Цикл с
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 > 3 → best = 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)
Разбор логики:
- Читаем
x = 2. Вseenпусто.9 - 2 = 7не найден. Кладём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!».
Пример: 5 → 120.
Осторожно с типами:
| 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) |
Классический баг в лабораторных:
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) или из терминала. Сверяйте вывод с блоком «Вход / Выход» — так быстрее закрепляется связь между кодом и результатом, и проще сдавать автопроверку на курсах.