Перейти к основному содержимому

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


Для кого эта статья

Подборка готовых решений на Java 17+ с подробным разбором каждой строки — «что написано» и «зачем так». Материал рассчитан на:

  • школьников — лабораторные по информатике, подготовка к олимпиадам и ЕГЭ (задания на программирование);
  • студентов — первый курс «Основы программирования», Java на JVM;
  • самоучек — когда в Google ищут «java scanner пример», «сумма элементов массива java», «fizzbuzz java», «hashmap подсчёт слов»;
  • тех, кто уже решал алгоритмы на Python и хочет те же приёмы на Java.

Каждый пример — один файл ИмяКласса.java. Алгоритм работы:

  1. Скопировать код в файл (имя файла = имя public class).
  2. Скомпилировать и запустить.
  3. Сверить вывод с блоком «Вход / Выход».
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 и в учебнике программа почти всегда устроена одинаково:

  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". Подробнее — 40.md.

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

ПравилоПояснение
Имя файла = имя 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?

ScannerBufferedReader
УдобствоПроще для новичка: 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

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

  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 — все числа в одной строке

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

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

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

  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
Числа в одной строке через пробел, без nC
Очень много данных, лимит по времени жёсткий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, число 99 > 3best = 9, pos = 2.
i = 3, число 11 не больше 9 — не обновляем.
i = 4, число 99 > 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]:

ia[i]pref[i+1]
011
123
236
3410
4515

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)

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

  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 и массив. Выведите элементы в отсортированном порядке через пробел».

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).
Для ArrayListCollections.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

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

Шагabt = a % b
1481812
218126
31260
460— стоп

Ответ: 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();
}
}

Пример: 5120.

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

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

Разбор:

Шагabnext
i=0112
i=1123
i=2235

Смысл: два переменных хранят «текущее» и «следующее» — итеративный 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)
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 и backendSpring Boot

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

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").