Java — консольные задачи
Для кого эта статья
Подборка готовых решений на Java 17+ с подробным разбором каждой строки — «что написано» и «зачем так». Материал рассчитан на:
- школьников — лабораторные по информатике, подготовка к олимпиадам и ЕГЭ (задания на программирование);
- студентов — первый курс «Основы программирования», Java на JVM;
- самоучек — когда в Google ищут «java scanner пример», «сумма элементов массива java», «fizzbuzz java», «hashmap подсчёт слов»;
- тех, кто уже решал алгоритмы на Python и хочет те же приёмы на Java.
Каждый пример — один файл ИмяКласса.java. Алгоритм работы:
- Скопировать код в файл (имя файла = имя
public class). - Скомпилировать и запустить.
- Сверить вывод с блоком «Вход / Выход».
javac SumTwoNumbers.java
java SumTwoNumbers
Если вход лежит в файле input.txt (удобно для проверки на Stepik и в IDE):
java SumTwoNumbers < input.txt
Синтаксис и Scanner — Основные конструкции. Циклы и условия — Операторы и циклы. Коллекции — отдельная глава. Окна, кнопки и формы на Swing — галерея с построчным разбором (теория — JavaFX и GUI). Мини-приложения в энциклопедии — Простые приложения. Серверные сниппеты (NIO, JDBC) — Примеры решений в Java.
Краткий указатель — что ищут в Google
| Раздел | Типичный запрос |
|---|---|
| Каркас программы | 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". Подробнее — 40.md. |
Правила файла:
| Правило | Пояснение |
|---|---|
Имя файла = имя 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 целых чисел. Выведите их сумму».
import java.util.Scanner;
public class ArraySum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long sum = 0;
for (int i = 0; i < n; i++) {
sum += sc.nextInt();
}
System.out.println(sum);
sc.close();
}
}
Пример:
Вход:
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 — все числа в одной строке
Формулировка: «В одной строке через пробел записаны целые числа. Выведите максимум».
import java.util.Scanner;
public class LineMax {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String[] parts = line.trim().split("\\s+");
int max = Integer.parseInt(parts[0]);
for (int i = 1; i < parts.length; i++) {
int x = Integer.parseInt(parts[i]);
if (x > max) {
max = x;
}
}
System.out.println(max);
sc.close();
}
}
Пример:
Вход: 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.
import java.io.*;
import java.util.*;
public class FastSum {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
long sum = 0;
for (int i = 0; i < n; i++) {
sum += Long.parseLong(st.nextToken());
}
System.out.println(sum);
br.close();
}
}
Пример: тот же, что у шаблона B — вход 5 и 3 1 4 1 5, выход 14.
Разбор:
| Конструкция | Зачем |
|---|---|
throws IOException | Чтение из потока может завершиться ошибкой — Java требует это указать у main. |
BufferedReader | Читает блоками, а не по одному символу — быстрее на больших файлах. |
readLine() | Одна строка входа без \n. |
StringTokenizer | Делит строку на токены (слова) по пробелам — аналог split, но без создания массива строк на каждый шаг. |
nextToken() | Следующий кусок строки. |
Long.parseLong | Как parseInt, но для типа long. |
Подробнее про оба способа ввода — 16.md.
На 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 чисел. Сколько элементов чётные?»
import java.util.Scanner;
public class CountEvens {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
for (int i = 0; i < n; i++) {
int x = sc.nextInt();
if (x % 2 == 0) {
count++;
}
}
System.out.println(count);
sc.close();
}
}
Пример:
Вход:
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 — это главный источник ошибок.
import java.util.Scanner;
public class MaxWithIndex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int best = sc.nextInt();
int pos = 1;
for (int i = 2; i <= n; i++) {
int x = sc.nextInt();
if (x > best) {
best = x;
pos = i;
}
}
System.out.println(best + " " + pos);
sc.close();
}
}
Пример:
Вход:
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, иначе само число».
Задача на приоритет условий — популярна на собеседованиях и в учебниках.
import java.util.Scanner;
public class FizzBuzz {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 1; i <= n; i++) {
if (i % 15 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
sc.close();
}
}
Пример (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 и массив. Выведите элементы в обратном порядке через пробел».
import java.util.Scanner;
public class FillArray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (int i = n - 1; i >= 0; i--) {
System.out.print(a[i] + (i > 0 ? " " : ""));
}
System.out.println();
sc.close();
}
}
Пример:
Вход:
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). Выведите их в обратном порядке».
import java.util.*;
public class DynamicList {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
while (sc.hasNextInt()) {
list.add(sc.nextInt());
}
Collections.reverse(list);
for (int i = 0; i < list.size(); i++) {
if (i > 0) System.out.print(" ");
System.out.print(list.get(i));
}
System.out.println();
sc.close();
}
}
Пример:
Вход (файл):
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].
import java.util.Scanner;
public class RangeSum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
long[] pref = new long[n + 1];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
pref[i + 1] = pref[i] + a[i];
}
int l = sc.nextInt();
int r = sc.nextInt();
System.out.println(pref[r + 1] - pref[l]);
sc.close();
}
}
Пример:
Вход:
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)
Формулировка: «Даны слова через пробел (до конца строки). Для каждого слова выведите, сколько раз оно встретилось».
import java.util.*;
public class WordFrequency {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, Integer> freq = new HashMap<>();
while (sc.hasNext()) {
String word = sc.next().toLowerCase();
freq.merge(word, 1, Integer::sum);
}
for (Map.Entry<String, Integer> e : freq.entrySet()) {
System.out.println(e.getKey() + ": " + e.getValue());
}
sc.close();
}
}
Пример:
Вход: 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 целых. Сколько различных значений?»
import java.util.*;
public class UniqueCount {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Set<Integer> seen = new HashSet<>();
for (int i = 0; i < n; i++) {
seen.add(sc.nextInt());
}
System.out.println(seen.size());
sc.close();
}
}
Пример:
Вход:
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».
import java.util.*;
public class TwoSumExists {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
Set<Integer> seen = new HashSet<>();
boolean found = false;
for (int i = 0; i < n; i++) {
int x = sc.nextInt();
if (seen.contains(k - x)) {
found = true;
break;
}
seen.add(x);
}
System.out.println(found ? "YES" : "NO");
sc.close();
}
}
Пример:
Вход:
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 и массив. Выведите элементы в отсортированном порядке через пробел».
import java.util.*;
public class SortArray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
for (int i = 0; i < n; i++) {
if (i > 0) System.out.print(" ");
System.out.print(a[i]);
}
System.out.println();
sc.close();
}
}
Пример:
Вход:
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».
import java.util.*;
public class BinarySearchDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
int target = sc.nextInt();
int idx = Arrays.binarySearch(a, target);
System.out.println(idx >= 0 ? idx : -1);
sc.close();
}
}
Пример:
Вход:
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 — самый большой)».
import java.util.*;
public class KthLargest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
System.out.println(a[n - k]);
sc.close();
}
}
Пример:
Вход:
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. Палиндром
Формулировка: «Дана строка. Является ли она палиндромом (читается одинаково слева направо и справа налево)? Игнорируйте пробелы и регистр».
import java.util.Scanner;
public class Palindrome {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine().replaceAll("\\s+", "").toLowerCase();
int left = 0;
int right = s.length() - 1;
boolean ok = true;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
ok = false;
break;
}
left++;
right--;
}
System.out.println(ok ? "YES" : "NO");
sc.close();
}
}
Пример:
Вход: А роза упала на лапу Азора
Выход: YES
Разбор:
| Строка | Смысл |
|---|---|
nextLine() | Вся строка целиком (с пробелами). |
replaceAll("\\s+", "") | Убираем все пробельные символы. |
toLowerCase() | А и а сравниваем одинаково. |
charAt(i) | Символ на позиции i (индексы с 0). |
| Два указателя | left с начала, right с конца — сходятся к центру за O(n). |
4.2. Подсчёт гласных
Формулировка: «Дана строка. Сколько в ней гласных букв (латиница и кириллица)?»
import java.util.Scanner;
public class CountVowels {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine().toLowerCase();
int count = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ("aeiouyаеёиоуыэюя".indexOf(c) >= 0) {
count++;
}
}
System.out.println(count);
sc.close();
}
}
Пример:
Вход: Hello мир
Выход: 3
(e, o — латиница; и — кириллица)
Разбор: indexOf(c) >= 0 — символ найден в строке-наборе гласных. Альтернатива — Set<Character> с гласными.
4.3. Разворот слов в предложении
Формулировка: «Дана фраза из слов через пробел. Выведите слова в обратном порядке».
import java.util.Scanner;
public class ReverseWords {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine().trim();
String[] words = line.split("\\s+");
StringBuilder sb = new StringBuilder();
for (int i = words.length - 1; i >= 0; i--) {
if (sb.length() > 0) sb.append(' ');
sb.append(words[i]);
}
System.out.println(sb);
sc.close();
}
}
Пример:
Вход: Java учат на первом курсе
Выход: курсе первом на учат Java
Разбор:
| Конструкция | Зачем |
|---|---|
split("\\s+") | Несколько подряд пробелов не дают пустых слов. |
StringBuilder | Эффективная склейка строк в цикле. s = s + word создавала бы новую строку на каждой итерации. |
5. Числа и классика
5.1. НОД — алгоритм Евклида
Формулировка: «Даны два натуральных числа. Найдите их наибольший общий делитель (НОД)».
import java.util.Scanner;
public class Gcd {
static int gcd(int a, int b) {
while (b != 0) {
int t = a % b;
a = b;
b = t;
}
return Math.abs(a);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(gcd(a, b));
sc.close();
}
}
Пример:
Вход:
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».
import java.util.Scanner;
public class IsPrime {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
if (n < 2) {
System.out.println("NO");
sc.close();
return;
}
boolean prime = true;
for (long d = 2; d * d <= n; d++) {
if (n % d == 0) {
prime = false;
break;
}
}
System.out.println(prime ? "YES" : "NO");
sc.close();
}
}
Пример: 17 → YES, 15 → NO (делится на 3).
Разбор: достаточно проверять делители d от 2 до √n. Если n = a · b и оба фактора больше √n, их произведение уже больше n — противоречие.
5.3. Факториал
Формулировка: «Дано n. Выведите n!».
import java.util.Scanner;
public class Factorial {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long fact = 1;
for (int i = 2; i <= n; i++) {
fact *= i;
}
System.out.println(fact);
sc.close();
}
}
Пример: 5 → 120.
Осторожно с типами:
| n | Помещается в int? |
|---|---|
| 12! | да |
| 13! | уже нет — используйте long |
| 21! | не помещается в long — нужен BigInteger |
6. Интерактивное меню
Полные калькулятор, викторина и работа с файлами — в 131.md. Здесь — каркас программы, которая работает, пока пользователь не выберет «выход».
6.1. Меню с switch
import java.util.Scanner;
public class SimpleMenu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("1 — привет 2 — квадрат числа 0 — выход");
System.out.print("Выбор: ");
String choice = sc.nextLine().trim();
switch (choice) {
case "1" -> System.out.println("Привет!");
case "2" -> {
System.out.print("Число: ");
int x = Integer.parseInt(sc.nextLine().trim());
System.out.println(x * x);
}
case "0" -> running = false;
default -> System.out.println("Неизвестная команда");
}
}
sc.close();
}
}
Разбор:
| Элемент | Смысл |
|---|---|
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. Пользователь угадывает; программа отвечает “больше” / “меньше”».
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;
public class GuessNumber {
public static void main(String[] args) {
int secret = ThreadLocalRandom.current().nextInt(1, 101);
Scanner sc = new Scanner(System.in);
System.out.println("Угадайте число от 1 до 100");
while (true) {
System.out.print("Ваш вариант: ");
int guess = Integer.parseInt(sc.nextLine().trim());
if (guess < secret) {
System.out.println("Больше");
} else if (guess > secret) {
System.out.println("Меньше");
} else {
System.out.println("Верно!");
break;
}
}
sc.close();
}
}
Разбор:
| Строка | Смысл |
|---|---|
nextInt(1, 101) | Случайное от 1 включительно до 101 исключительно — то есть 1…100. |
ThreadLocalRandom | Рекомендуемый генератор в новом коде (см. 16.md). |
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 (число тестов). Для каждого теста — свой формат входа».
import java.util.Scanner;
public class ManyTests {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for (int test = 0; test < t; test++) {
int n = sc.nextInt();
long sum = 0;
for (int i = 0; i < n; i++) {
sum += sc.nextInt();
}
System.out.println(sum);
}
sc.close();
}
}
Пример:
Вход:
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 цифр, с ведущими нулями |
Полная таблица — 16.md.
8. Популярные запросы из Google
Задачи, по которым чаще всего приходят из поиска и с форумов («как на Java…»). У каждой — формулировка, код, вход/выход и разбор по строкам.
8.1. Сумма элементов массива
Запрос: java сумма элементов массива, array sum java.
Формулировка: «Дано n, затем n целых. Выведите сумму всех элементов».
import java.util.Scanner;
public class ArrayElementsSum {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
long sum = 0;
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
sum += a[i];
}
System.out.println(sum);
sc.close();
}
}
Пример:
Вход:
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). Выведите среднее с двумя знаками после запятой».
import java.util.Scanner;
public class ArrayAverage {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long sum = 0;
for (int i = 0; i < n; i++) {
sum += sc.nextInt();
}
double avg = (double) sum / n;
System.out.printf("%.2f%n", avg);
sc.close();
}
}
Пример:
Вход:
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 и массив. Выведите минимальный элемент».
import java.util.Scanner;
public class ArrayMin {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int min = sc.nextInt();
for (int i = 1; i < n; i++) {
int x = sc.nextInt();
if (x < min) {
min = x;
}
}
System.out.println(min);
sc.close();
}
}
Пример:
Вход:
5
3 9 1 9 0
Выход:
0
Разбор: зеркальная логика к максимуму с индексом — первый элемент сразу в min, дальше сравниваем с <.
8.4. Разворот строки
Запрос: java reverse string, перевернуть строку java.
Формулировка: «Дана строка. Выведите её задом наперёд».
import java.util.Scanner;
public class ReverseString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
StringBuilder reversed = new StringBuilder();
for (int i = s.length() - 1; i >= 0; i--) {
reversed.append(s.charAt(i));
}
System.out.println(reversed);
sc.close();
}
}
Пример:
Вход: Java
Выход: avaJ
Разбор:
| Строка | Смысл |
|---|---|
i = s.length() - 1 | Индекс последнего символа (индексация с 0). |
charAt(i) | Символ на позиции i; у String нет s[i], как в C. |
StringBuilder | Склеиваем символы без создания лишних строк — см. 296.md. |
Короткий вариант (Java 15+): new StringBuilder(s).reverse().toString() — для учебника лучше понимать цикл.
8.5. Сортировка пузырьком (Bubble Sort)
Запрос: bubble sort java, сортировка пузырьком java.
Формулировка: «Дано n и массив. Отсортируйте по возрастанию сортировкой пузырьком и выведите».
import java.util.Scanner;
public class BubbleSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
for (int i = 0; i < n; i++) {
if (i > 0) System.out.print(" ");
System.out.print(a[i]);
}
System.out.println();
sc.close();
}
}
Пример:
Вход:
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».
import java.util.Scanner;
public class LinearSearch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int x = sc.nextInt();
int index = -1;
for (int i = 0; i < n; i++) {
if (a[i] == x) {
index = i;
break;
}
}
System.out.println(index);
sc.close();
}
}
Пример:
Вход:
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 …».
import java.util.Scanner;
public class Fibonacci {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long a = 1, b = 1;
for (int i = 0; i < n; i++) {
if (i > 0) System.out.print(" ");
System.out.print(a);
long next = a + b;
a = b;
b = next;
}
System.out.println();
sc.close();
}
}
Пример:
Вход: 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.
Формулировка: «Дано целое неотрицательное число. Сколько в нём цифр?»
import java.util.Scanner;
public class CountDigits {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
if (n == 0) {
System.out.println(1);
sc.close();
return;
}
int count = 0;
while (n > 0) {
count++;
n /= 10;
}
System.out.println(count);
sc.close();
}
}
Пример:
Вход: 12045
Выход: 5
Разбор:
| Строка | Смысл |
|---|---|
n == 0 → 1 | Особый случай: у нуля одна цифра. |
n /= 10 | Отбрасываем последнюю цифру (целочисленное деление). |
while (n > 0) | Пока есть цифры — увеличиваем счётчик. |
Альтернатива: String.valueOf(n).length() — короче, но на экзамене часто требуют цикл.
8.9. Удалить дубликаты, сохранив порядок
Запрос: java удалить дубликаты из массива, unique elements preserve order.
Формулировка: «Дано n и массив. Выведите уникальные элементы в порядке первого появления через пробел».
import java.util.*;
public class UniqueOrdered {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
LinkedHashSet<Integer> set = new LinkedHashSet<>();
for (int i = 0; i < n; i++) {
set.add(sc.nextInt());
}
boolean first = true;
for (int x : set) {
if (!first) System.out.print(" ");
System.out.print(x);
first = false;
}
System.out.println();
sc.close();
}
}
Пример:
Вход:
8
1 2 2 3 1 4 3 5
Выход:
1 2 3 4 5
Разбор:
| Конструкция | Зачем |
|---|---|
LinkedHashSet | Как HashSet (уникальность), но помнит порядок вставки — см. 24.md. |
HashSet без Linked | Порядок вывода мог бы быть произвольным — автопроверка упала бы. |
8.10. Подсчёт слов в строке
Запрос: java подсчитать слова в строке, count words java.
Формулировка: «Дана строка из слов через пробел. Сколько слов?»
import java.util.Scanner;
public class CountWords {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine().trim();
if (line.isEmpty()) {
System.out.println(0);
sc.close();
return;
}
String[] words = line.split("\\s+");
System.out.println(words.length);
sc.close();
}
}
Пример:
Вход: 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 (13.md) или из терминала. Сверяйте вывод с блоком «Вход / Выход» — так быстрее закрепляется связь между кодом и результатом, и проще сдавать автопроверку на курсах.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Практическая карта типовых IT-задач: термины, пошаговое внедрение, проверка качества и типичные ошибки. Простой консольный чат на C# — учебное приложение с сокетами: TCP между клиентом и сервером, многопоточность и обмен сообщениями в консоли. Примеры вёрстки на HTML и CSS с разбором: центрирование, Flexbox, Grid, формы, шапка, подвал и адаптив для учебы и портфолио. Перед началом работы обязательно изучите главу Turtle . Галерея 3D-фигур на Panda3D — карточки, куб, пирамида, сфера, сетки и составные сцены; код для локального запуска. Готовые docker-compose.yml с разбором каждой строки — nginx, PostgreSQL, Redis, WordPress, MongoDB. Примеры для школьников и студентов: postgres example, поднять базу локально, app + db. Примеры nginx.conf для статики, reverse proxy, React/Vue SPA, PHP, SSL и балансировки — построчный разбор директив, проверка curl и типичные ошибки для лабораторных и VPS. dockerfile example — 10 готовых Dockerfile с построчным разбором: node, python, golang, react nginx, spring boot, php, dotnet. Для студентов, лабораторных и docker build с нуля. PromQL example — готовые запросы Prometheus и Grafana с построчным разбором: up, rate, node_exporter cpu, memory, disk, http_requests_total, histogram_quantile p99, алерты. Для студентов, лабораторных и devops docker compose. Готовые манифесты Kubernetes с разбором каждой строки — Pod, Deployment, Service, ConfigMap, Secret, Ingress. Примеры для Minikube, kind и kubectl apply. Примеры графиков Matplotlib на Python для школьников и студентов — sin, cos, парабола, столбцы, scatter, гистограмма, подграфики; код с подробным разбором. Примеры pandas на Python для школьников и студентов — DataFrame, фильтрация, groupby, очистка, merge, сводные таблицы и экспорт; код с подробным разбором каждой строки.Готовые решения
Простой консольный чат на CSharp
HTML + CSS — готовые макеты
Примеры фигур Turtle на Python
Примеры фигур Panda3D на Python
Docker Compose — готовые стеки
Nginx — конфиги под задачу
Dockerfile — 10 типовых образов
Prometheus + Grafana — запросы
Kubernetes YAML — минимальные манифесты
Matplotlib — графики
Pandas — типовые операции