← Назад к вопросам

Проверка числа на палиндром

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), только две переменные

Примеры и тест-кейсы

  1. 121: разворот даёт 121 ✓
  2. 12321: разворот даёт 12321 ✓
  3. 123: разворот даёт 321 ✗
  4. -121: отрицательное число ✗
  5. 0: палиндром ✓
  6. 1001: разворот даёт 1001 ✓
  7. 10: не палиндром ✗

Edge cases и типичные ошибки

  1. Отрицательные числа: false
  2. Ноль: палиндром
  3. Однозначные: все палиндромы
  4. Числа с нулями в конце: не палиндромы
  5. Переполнение: Оптимизированный метод избегает этого
  6. Integer.MIN_VALUE: отрицательное, корректно обработано

Решение демонстрирует чистую математику без строк.