Ссылка на задачу

Дано целое число x, верните true, если x является палиндромом, и false в ином случае.

Нужно попробовать решить эту задачу без конвертации числа в строку.

Example 1:

Input: x = 121
Output: true
Explanation: 121 reads as 121 from left to right and from right to left.
Example 2:

Input: x = -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:

Input: x = 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

Решение на Java

class Solution {
    public boolean isPalindrome(int x) {
        int original = x;
        int reversed = 0;

        while(x > 0) {
            int last_digit = x % 10;
            reversed = reversed * 10 + last_digit;
            x = x / 10;
        }

        return original == reversed;
    }
}

Объяснение

  1. Запоминает оригинальное число:

    int original = x;
    

    Мы сохраняем оригинальное значение числа x в переменную original, чтобы потом сравнить с обратным числом.

  2. Создает переменную для хранения перевернутого числа:

    int reversed = 0;
    

    Переменная reversed будет хранить число, полученное из цифр x, но в обратном порядке.

  3. Переворачивает число:

    • Пока x больше нуля, выполняем цикл:
      while(x > 0) {
          int last_digit = x % 10;           // Берем последнюю цифру числа x
          reversed = reversed * 10 + last_digit; // Добавляем последнюю цифру к перевернутому числу
          x = x / 10;                        // Убираем последнюю цифру из x
      }
      
    • Давайте разберем это на примере:
      • Пусть x = 123.
      • В первой итерации: last_digit = 3, reversed = 0 * 10 + 3 = 3, x = 12.
      • Во второй итерации: last_digit = 2, reversed = 3 * 10 + 2 = 32, x = 1.
      • В третьей итерации: last_digit = 1, reversed = 32 * 10 + 1 = 321, x = 0.
  4. Сравнивает оригинальное число с перевернутым:

    return original == reversed;
    

    Если оригинальное число равно перевернутому, значит, число является палиндромом, и функция возвращает true. В противном случае возвращает false.

Пример:

  • Пусть x = 121.
    • Оригинальное число сохраняется в original = 121.
    • Переворачиваем x:
      • last_digit = 1, reversed = 0 * 10 + 1 = 1, x = 12.
      • last_digit = 2, reversed = 1 * 10 + 2 = 12, x = 1.
      • last_digit = 1, reversed = 12 * 10 + 1 = 121, x = 0.
    • original == reversed, значит, 121 является палиндромом, и функция вернет true.

Решение на Ruby

# @param {Integer} x
# @return {Boolean}
def is_palindrome(x)
    original = x
    reversed = 0

    while x > 0
        last_digit = x % 10
        reversed = reversed * 10 + last_digit
        x = x / 10
    end
    
    reversed == original
end

Решение на Golang

func isPalindrome(x int) bool {
    original := x
    reversed := 0

    for x > 0 {
        lastDigit := x % 10
        reversed = reversed * 10 + lastDigit
        x = x / 10
    }

    return original == reversed
}

Решение на Javascript / Typescript

function isPalindrome(x: number): boolean {
    let original: number = x
    let reversed: number = 0

    while(x > 0) {
        let lastDigit: number = x % 10
        reversed = reversed * 10 + lastDigit
        x = Math.floor(x / 10)
    }

    return original == reversed
};

Решение на Python

class Solution:
    def isPalindrome(self, x: int) -> bool:
        original: int = x
        reversed: int = 0

        while x > 0:
            last_digit: int = x % 10
            reversed = reversed * 10 + last_digit
            x = x // 10
        
        return original == reversed
        

Решение на PHP

class Solution {

    /**
     * @param Integer $x
     * @return Boolean
     */
    function isPalindrome($x) {
        $original = $x;
        $reversed = 0;

        while ($x > 0) {
            $last_digit = $x % 10;
            $reversed = $reversed * 10 + $last_digit;
            $x = (int)($x / 10);
        }

        return $original == $reversed;
    }
}

Решение на Csharp

public class Solution {
    public bool IsPalindrome(int x) {
        int original = x;
        int reversed = 0;

        while (x > 0) {
            int lastDigit = x % 10;
            reversed = reversed * 10 + lastDigit;
            x = x / 10;
        }

        return original == reversed;
    }
}