Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
Example 1:
Input: x = 121 Output: true
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.
Example 4:
Input: x = -101 Output: false
Constraints:
-231 <= x <= 231 - 1
Source
def is_palindrome(x):
"""cheating mthod, convert into string."""
if x < 0:
return False
num = str(x)
left = 0
right = len(num)-1
while left < right:
if num[left] != num[right]:
return False
left += 1
right -= 1
return True
is_palindrome(121)
True
is_palindrome(-121)
False
is_palindrome(10)
False
is_palindrome(-101)
False
Could you solve it without converting the integer to a string?
from math import log10
def is_palindrome(x):
"""build reverse number."""
if x < 0: # base case: negative number
return False
if x < 10: # base case: single digit number
return True
digit = int(log10(x))+1
num = 0
p = x
for i in range(digit):
# Option 1: building number from right to left
last_digit = p % 10
num += last_digit * 10 ** (digit-1-i)
p = (p - last_digit) // 10
# Option 2: building number from left to right
# left_digit = p // (10 ** (digit-1-i))
# num += left_digit * (10 ** i)
# p -= left_digit * (10 ** (digit-1-i))
return x == num
def is_palindrome(x):
"""compare left & right digit"""
if x < 0:
return False
if x < 10:
return True
order = 1
while x // order >= 10:
order *= 10
# # alternative
# digit = int(log10(x))+1
# order = 10**(digit-1)
while x:
left = x // order
right = x % 10
if left != right:
return False
x = (x - left * order) // 10
order = order // 100
return True
is_palindrome(121)
True
is_palindrome(-121)
False
is_palindrome(10)
False
is_palindrome(-101)
False