Найти в Дзене

Решение задачи "Проверка палиндрома" на Python

Недавно в своём ТГ-канале опубликовал эту задачу. Здесь опубликую её решение. Нужно написать функцию, которая в качестве аргумента принимает целое число x. Функция должна возвращать true, если x является палиндромом, и false в противном случае. Пример 1: Ввод: x = 121 Вывод: true Объяснение: 121 читается одинаково как слева направо, так и справа налево. Пример 2: Ввод: x = -121 Вывод: false Объяснение: Число слева направо читается как -121. Справа налево оно становится 121-, что не является палиндромом. Пример 3: Ввод: x = 10 Вывод: false Объяснение: Справа налево получается 01 - число не является палиндромом. Самый простой способ решить эту задачу - просто перевести число в строку, развернуть её и посмотреть, совпадает ли развёрнутая строка с исходной: В решении ниже я пытался улучшить этот алгоритм. Получилось забавно: моё решение работает медленнее в большинстве случаев из-за особенностей реализации строк и списков в Python. Поэтому в качестве "эталонного" решения пока что пред
Оглавление

Недавно в своём ТГ-канале опубликовал эту задачу. Здесь опубликую её решение.

Формулировка задачи

Нужно написать функцию, которая в качестве аргумента принимает целое число x. Функция должна возвращать true, если x является палиндромом, и false в противном случае.

Пример 1:

Ввод: x = 121

Вывод: true

Объяснение: 121 читается одинаково как слева направо, так и справа налево.

Пример 2:

Ввод: x = -121

Вывод: false

Объяснение: Число слева направо читается как -121. Справа налево оно становится 121-, что не является палиндромом.

Пример 3:

Ввод: x = 10

Вывод: false

Объяснение: Справа налево получается 01 - число не является палиндромом.

Дополнение:

Самый простой способ решить эту задачу - просто перевести число в строку, развернуть её и посмотреть, совпадает ли развёрнутая строка с исходной:

-2

В решении ниже я пытался улучшить этот алгоритм. Получилось забавно: моё решение работает медленнее в большинстве случаев из-за особенностей реализации строк и списков в Python.

Я проверил алгоритмы на скорость выполнения. В большинстве случаев алгоритм выше (обозначен буквой "П") работает быстрее предложенного мной (обозначен "М")
Я проверил алгоритмы на скорость выполнения. В большинстве случаев алгоритм выше (обозначен буквой "П") работает быстрее предложенного мной (обозначен "М")

Поэтому в качестве "эталонного" решения пока что предлагаю алгоритм выше, а алгоритм, описанный мной ниже, предлагаю только как пример подхода улучшения кода за счёт рассмотрения частных случаев.

Решение

При решении этого задания в Python удобнее работать не с типом данных "integer", а со строкой, поэтому преобразуем тип с помощью функции str().

В качестве параметра функции передаётся целое число x. В качестве возвращаемого значения будет True или False
В качестве параметра функции передаётся целое число x. В качестве возвращаемого значения будет True или False

Сначала нужно проверить не является ли число отрицательным: отрицательные числа не могут быть палиндромами, так как минус записывается только в начале числа. Соответственно, если в начале строки x находится знак минуса, то сразу же можем вернуть False - число не палиндром.

Первый символ строки находится под индексом 0
Первый символ строки находится под индексом 0

Также сразу же вернём True, если число однозначное: все однозначные числа являются палиндромами. Так как мы уже проверили, что в начале строки x не стоит знак минуса, нам достаточно лишь узнать, сколько символов в строке.

Все неотрицательные однозначные числа являются палиндромами
Все неотрицательные однозначные числа являются палиндромами

Далее находим индекс символа, расположенного в середине строки x. Делается это очень просто: чтобы учесть наличие строк с чётным и нечётным количеством символов, достаточно целочисленно разделить длину строки на 2.

Далее мы должны подметить, что палиндром - это строка, у которой последовательность символов до середины строки совпадает с половиной символов после середины строки, записанной в обратном порядке. То же самое справедливо и если развернуть первую половину строки, а вторую не трогать.

Например, число "123454321". Середина строки - это символ "5". Последовательность символов до середины строки ("1234") совпадает с последовательностью после середины строки ("4321"), если последовательность после середины строки развернуть.

Чтобы взять первую половину и вторую половину строки, используем срезы.

Строка делится на две равные части с помощью срезов и индекса центрального символа
Строка делится на две равные части с помощью срезов и индекса центрального символа

Логическое высказывание, проверяющее равняется ли первая половина строки, записанная в обратном порядке, второй половине, можно сформулировать так:

функция возвращает True, если первая половина равнаяется развёрнутой второй половине. Иначе False
функция возвращает True, если первая половина равнаяется развёрнутой второй половине. Иначе False

Конечный результат

Собираем все наработки в одну функцию:

Решение задачи
Решение задачи