Как проверить, является ли число палиндромом?
Любой язык. Любой алгоритм. (кроме алгоритма преобразования числа в строку с последующим переворачиванием строки).
algorithm
language-agnostic
Эстебан Арая
источник
источник
number
иis a palindrome
должно означать в этом контексте: как насчет 13E31 (основание десять)? 01210 (ведущий ноль)? + 10-10 + 1 (пятизначная сбалансированная троичная система)?Ответы:
Это одна из проблем проекта Эйлера . Когда я решил это в Haskell, я сделал именно то, что вы предлагаете, преобразовал число в строку. Тогда просто проверить, является ли строка паллиндромом. Если он работает достаточно хорошо, зачем усложнять его? Быть паллиндромом - это свойство лексическое, а не математическое.
источник
to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo
- нет. Вычисления в целевой системе счисления, возможность добавления будет делать (подумайте, как вы обычно конвертируете из десятичного числа в двоичное - использование, чтобы думать, что вычисление означает двоичный код , не означает, что вы не можете делать, например, десятичную арифметику (и вы можете делать преобразование из двоичного в десятичное без деления или по модулю 2)Для любого заданного числа:
Если
n == rev
затемnum
палиндром:источник
num
после деления (более свободный набор текста), вам нужно будет это сделатьnum = floor(num / 10)
.Работает только для целых чисел. Из постановки задачи неясно, нужно ли учитывать числа с плавающей запятой или ведущие нули.
источник
Выше большинство ответов, имеющих тривиальную проблему, заключается в том, что переменная int может переполниться.
См. Http://articles.leetcode.com/palindrome-number/
источник
источник
Положите каждую цифру в стопку, а затем вытащите их. Если вперед и назад то же самое, то это палиндром.
источник
Я не заметил никаких ответов, которые решали бы эту проблему без лишнего пробела, т. Е. Все решения, которые я видел, использовали либо строку, либо другое целое число, чтобы перевернуть число, либо некоторые другие структуры данных.
Хотя такие языки, как Java, оборачиваются при целочисленном переполнении, это поведение не определено в таких языках, как C. ( Попробуйте изменить 2147483647 (Integer.MAX_VALUE) в Java ) Обходной путь
может заключаться в использовании длинного или чего-то еще, но стилистически я не совсем нравится такой подход.
Итак, концепция палиндромного числа заключается в том, что число должно читаться одинаково вперед и назад. Отлично. Используя эту информацию, мы можем сравнить первую цифру и последнюю цифру. Хитрость в том, что для первой цифры нам нужен порядок чисел. Скажем, 12321. Разделив это на 10000, мы получим ведущую единицу. Конечную 1 можно получить, взяв мод с 10. Теперь уменьшим это до 232
(12321 % 10000)/10 = (2321)/10 = 232
.. А теперь 10000 нужно уменьшить в 2 раза. Итак, теперь перейдем к коду Java ...Отредактировано в соответствии с предложением Хардика , чтобы охватить случаи, когда в числе есть нули.
источник
В Python есть быстрый итеративный способ.
Это также предотвращает проблемы с памятью с рекурсией (например, ошибка StackOverflow в Java).
источник
Самый быстрый способ, который я знаю:
источник
Просто для удовольствия, этот тоже работает.
источник
Зачем отказываться от этого решения? Это легко реализовать и читать . Если вас спросят, не имея под рукой компьютера,
2**10-23
является десятичный палиндром, вы бы обязательно проверили его, записав его в десятичном виде.По крайней мере, в Python слоган «строковые операции медленнее, чем арифметические» на самом деле неверен. Я сравнил арифметический алгоритм Smink с простым переворачиванием строк
int(str(i)[::-1])
. Существенной разницы в скорости не было - оказалось, что переворот струны был немного быстрее.В компилируемых языках (C / C ++) слоган может сохраняться, но есть риск возникновения ошибок переполнения с большими числами.
Результаты в секундах (чем меньше, тем лучше):
источник
Я ответил на проблему Эйлера очень грубо. Естественно, когда я добрался до новой разблокированной связанной ветки форума, на экране появился гораздо более умный алгоритм. А именно, член, который известен как Бегонер, имел такой новаторский подход, что я решил заново реализовать свое решение, используя его алгоритм. Его версия была на Python (с использованием вложенных циклов), и я повторно реализовал ее в Clojure (используя один цикл / повтор).
Здесь для вашего развлечения:
Были и ответы Common Lisp, но они не были для меня отклонены.
источник
Вот версия схемы, которая создает функцию, которая будет работать с любой базой. Он имеет проверку на избыточность: быстро возвращает false, если число кратно основному (заканчивается на 0).
И он восстанавливает не все перевернутое число, а только половину.
Это все, что нам нужно.
источник
Рекурсивное решение на рубине без преобразования числа в строку.
источник
Версия Голанга:
источник
Вытяните первую и последнюю цифры и сравните их, пока не кончится. Может остаться цифра или нет, но в любом случае, если все выскочившие цифры совпадают, это палиндром.
источник
Вот еще одно решение на C ++ с использованием шаблонов. Это решение будет работать для сравнения строк палиндрома без учета регистра.
источник
метод с немного лучшим постоянным коэффициентом, чем метод @sminks:
источник
вот версия af #:
источник
Число является палиндромным, если его строковое представление палиндромно:
источник
источник
Чтобы проверить, является ли данный номер палиндромом или нет (код Java)
источник
Многие решения, опубликованные здесь, меняют целое число на противоположное и сохраняют его в переменной, которая использует дополнительное пространство, которое есть
O(n)
, но вот решение сO(1)
пространством.источник
Я всегда использую это решение на питоне из-за его компактности.
источник
Попробуй это:
источник
Вот решение, использующее списки в виде стеков в Python:
при выталкивании стека для сравнения учитывается только самая правая часть числа, и при этом быстро не удается уменьшить количество проверок
источник
источник
источник
источник
Рекурсивный способ, не очень эффективный, просто предоставьте возможность
(Код Python)
источник