← Назад к вопросам
Проверка числа на палиндром
1.3 Junior🔥 71 комментариев
#Stream API и функциональное программирование#Основы Java
Условие
Напишите Java-программу, чтобы определить, является ли число палиндромом, без использования сторонних библиотек.
Палиндром — это число, которое читается одинаково слева направо и справа налево.
Примеры
- 121 → палиндром
- 12321 → палиндром
- 123 → не палиндром
- -121 → не палиндром (знак минус не считается)
Требования
- Не конвертируйте число в строку
- Обработайте отрицательные числа
- Алгоритм должен работать за O(log n)
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Подход
Обращаем число в обратном направлении, используя только арифметические операции (без преобразования в строку). Сравниваем перевёрнутое число с исходным. Для отрицательных чисел сразу возвращаем false.
Решение
public class PalindromeNumberChecker {
public static boolean isPalindrome(int number) {
if (number < 0) {
return false;
}
int original = number;
int reversed = 0;
while (number > 0) {
int lastDigit = number % 10;
reversed = reversed * 10 + lastDigit;
number /= 10;
}
return original == reversed;
}
public static boolean isPalindromeOptimized(int number) {
if (number < 0) {
return false;
}
if (number < 10) {
return true;
}
if (number % 10 == 0) {
return false;
}
int reversed = 0;
while (number > reversed) {
reversed = reversed * 10 + (number % 10);
number /= 10;
}
return number == reversed || number == reversed / 10;
}
public static void verifyPalindrome(int number) {
System.out.println("Проверка: " + number);
if (number < 0) {
System.out.println("Результат: НЕТ (отрицательное число)");
return;
}
int original = number;
int reversed = 0;
while (number > 0) {
int lastDigit = number % 10;
reversed = reversed * 10 + lastDigit;
number /= 10;
}
System.out.println("Исходное число: " + original);
System.out.println("Перевёрнутое число: " + reversed);
System.out.println("Результат: " + (original == reversed ? "ДА, палиндром" : "НЕТ, не палиндром"));
}
public static void main(String[] args) {
int[] examples = {121, 12321, 123, -121, 0, 1, 10, 1001};
for (int num : examples) {
verifyPalindrome(num);
System.out.println();
}
System.out.println("=== Тестирование ===");
System.out.println("121: " + isPalindrome(121) + " (ожидается true)");
System.out.println("12321: " + isPalindrome(12321) + " (ожидается true)");
System.out.println("123: " + isPalindrome(123) + " (ожидается false)");
System.out.println("-121: " + isPalindrome(-121) + " (ожидается false)");
System.out.println("0: " + isPalindrome(0) + " (ожидается true)");
System.out.println("10: " + isPalindrome(10) + " (ожидается false)");
System.out.println("1000000001: " + isPalindrome(1000000001) + " (ожидается true)");
}
}
Сложность
- Временная сложность: O(log n), количество цифр в числе
- Пространственная сложность: O(1), только две переменные
Примеры и тест-кейсы
- 121: разворот даёт 121 ✓
- 12321: разворот даёт 12321 ✓
- 123: разворот даёт 321 ✗
- -121: отрицательное число ✗
- 0: палиндром ✓
- 1001: разворот даёт 1001 ✓
- 10: не палиндром ✗
Edge cases и типичные ошибки
- Отрицательные числа: false
- Ноль: палиндром
- Однозначные: все палиндромы
- Числа с нулями в конце: не палиндромы
- Переполнение: Оптимизированный метод избегает этого
- Integer.MIN_VALUE: отрицательное, корректно обработано
Решение демонстрирует чистую математику без строк.