Постановка задачи
Учитывая целое число x, вернуть true, если x является целым палиндромом.
Целое число является палиндромом, если оно читается одинаково как в прямом, так и в обратном направлении. Например, 121 является палиндромом, а 123 — нет.
Пример 1:
Input: x = 121 Output: true
Пример 2:
Input: x = -121
Output: false
Пример 3:
Input: x = 10 Output: false
Пример 4:
Input: x = -101
Output: false
Ограничения:
- -2^31 <= x <= 2^31 - 1
Объяснение
Как упоминалось в условии задачи, палиндромное число — это число, которое одинаково читается с обеих сторон.
Решение грубой силы
Решение грубой силы будет состоять в том, чтобы преобразовать целое число в строку, перевернуть строку и проверить, совпадают ли две строки.
Но этот подход потребует дополнительного места для создания строки.
Временная сложность этой программы будет O(N). Сложность пространства будет O(M), где M — количество цифр в целом числе.
Оптимизированное решение
Мы можем избежать лишнего пространства и уменьшить временную сложность, подобно тому, как мы проверяем строку палиндрома. Но здесь мы получаем первую и последнюю цифры и сравниваем их.
Получить последнюю цифру очень просто, и мы можем использовать оператор модуля %. Получить первую цифру можно с помощью делителя.
Проверим алгоритм.
Алгоритм
- if x < 0 - return false. - set divisor = 1
// We use the divisor to compute the number of digits in the number x. // We keep multiplying the divisor by 10 till x / divisor is greater than equal to 10. - Loop while x / divisor >= 10 - divisor = divisor * 10
- Loop while x != 0 // here we check if first and last digit are same or not. - if x / divisor != x % 10 - return false
// remove the first digit - set x = x % divisor // remove the last digit - set x = x / 10
// since first and last digit are removed we divide divisor by 100 - set divisor = divisor / 100
- return true
Решение C++
class Solution { public: bool isPalindrome(int x) { if(x < 0){ return false; } int divisor = 1; while(x/divisor >= 10){ divisor *= 10; } while(x != 0){ if (x / divisor != x % 10) { return false; } x %= divisor; x /= 10; divisor /= 100; } return true; } };
Решение Golang
func isPalindrome(x int) bool { if x < 0 { return false } divisor := 1 for x / divisor >= 10 { divisor *= 10 } for x != 0 { if x / divisor != x % 10 { return false } x %= divisor x /= 10 divisor /= 100 } return true }
Решение для JavaScript
var isPalindrome = function(x) { if( x < 0 ){ return false; } let divisor = 1; while( x / divisor >= 10 ){ divisor *= 10; } while( x != 0 ){ if( Math.trunc(x / divisor) != Math.floor(x % 10) ){ return false; } x %= divisor; x = Math.floor( x / 10 ); divisor /= 100; } return true; };
Давайте проверим наш алгоритм.
x = 12321
Step 1: x < 0 12321 < 0 false
Step 2: divisor = 1
Step 3: while x / divisor >= 10 1. 12321 / 1 >= 10 12321 >= 10 divisor *= 10 divisor = 10
2. 12321 / 10 >= 10 1232 >= 10 divisor *= 10 divisor = 100
3. 12321 / 100 >= 10 123 >= 10 divisor *= 10 divisor = 1000
4. 12321 / 1000 >= 10 12 >= 10 divisor *= 10 divisor = 10000
5. 12321 / 10000 >= 10 1 >= 10 Loop exit
Step 4: while x != 0 1. 12321 / 10000 != 12321 % 10 1 != 1 false x %= divisor x = 12321 % 10000 x = 2321
x /= 10 x = 232 divisor /= 100 divisor = 100
2. 232 / 100 != 232 % 10 2 != 2 false
x %= divisor x = 232 % 100 x = 32
x /= 10 x = 3 divisor /= 100 divisor = 1
3. 3 / 1 != 3 % 10 3 != 3 false
x %= divisor x = 3 % 1 x = 0
x /= 10 x = 0 divisor /= 100 divisor = 0
4. x != 0 0 != 0 Loop exit
Step 5: return true
Первоначально опубликовано на https://alkeshghorpade.me.