Я не помітив жодних відповідей, які вирішили цю проблему, не використовуючи додаткового місця, тобто всі рішення, які я бачив, або використовували рядок, або інше ціле число для зворотного перетворення числа, або деякі інші структури даних.
Хоча такі мови, як Java, перетворюються на цілі переповнення, ця поведінка є невизначеною для таких мов, як C. ( Спробуйте змінити 2147483647 (Integer.MAX_VALUE) на Java ). Обхідним способом
можна було б користуватися довгим чи іншим, але, стилістично, я не дуже подібний підхід.
Тепер концепція паліндромного числа полягає в тому, що число повинно читати однакові вперед і назад. Чудово. Використовуючи цю інформацію, ми можемо порівняти першу і останню цифру. Трюк - для першої цифри нам потрібен порядок числа. Скажімо, 12321. Поділивши це на 10000, ми зробимо нас лідируючими 1. Трейлінг 1 можна отримати, взявши мод з 10. Тепер, щоб зменшити це до 232 (12321 % 10000)/10 = (2321)/10 = 232
. А тепер 10000 потрібно буде зменшити в 2 рази. Отже, тепер перейдемо до коду Java ...
private static boolean isPalindrome(int n) {
if (n < 0)
return false;
int div = 1;
// find the divisor
while (n / div >= 10)
div *= 10;
// any number less than 10 is a palindrome
while (n != 0) {
int leading = n / div;
int trailing = n % 10;
if (leading != trailing)
return false;
// % with div gets rid of leading digit
// dividing result by 10 gets rid of trailing digit
n = (n % div) / 10;
// got rid of 2 numbers, update div accordingly
div /= 100;
}
return true;
}
Відредаговано згідно з пропозицією Хардіка , щоб охопити випадки, коли в нулі є нулі.