I wrote a piece of code that generates the next palindromic number and that works fine. However I feel like my code isn't as efficient as it could be. Are there any tweaks that I could implement to make it run more efficiently?
Input format:
4 # No. of Test Cases
800
2133
103
6
Code I have currently:
def reverse(x):
return int(str(x)[::-1])
def count(left, right):
left_d = left % 10
right_d = int(str(right)[0])
if left < right:
return 1
elif left > right:
return 0
else:
left //= 10
right = int(str(right)[1:])
return count(left, right)
def nextPal(x):
length, rev = len(str(x)), reverse(x)
if length == 1:
return x + 1
elif x == int("9" * length):
return x + 2
elif length % 2 != 0 and x == rev:
digits = list(str(x))
mid = len(digits) // 2
digits[mid] = f"{int(digits[mid]) + 1}"
return int("".join(digits))
elif length % 2 == 0:
x_str = str(x)
left = int(x_str[:len(x_str) // 2])
right = int(x_str[len(x_str) // 2:])
left += count(left, right)
return int(f"{left}{reverse(left)}")
else:
while rev != x:
x += 1
rev = reverse(x)
return x
# Typically read from STDIN like 'python nextpal.py < data.txt'
cases = int(input())
for _ in range(cases):
case = int(input())
print(nextPal(case))
Output:
808
2222
111
7
nextPal(9)
returns10
? \$\endgroup\$nextPal(191)
gives1101
. You need to work on getting the code correct before you work on efficiency. \$\endgroup\$nextPal(8008)
returns808
! \$\endgroup\$