Problem Statement
A positive integer is called a palindrome if its representation in the decimal system is the same when read from left to right and from right to left. For a given positive integer K of not more than 1000000 digits, write the value of the smallest palindrome larger than K to output. Numbers are always displayed without leading zeros.
Input
The first line contains integer t, the number of test cases. Followed by t lines containing integers K.
Output
For each K, output the smallest palindrome larger than K.
Example
Input:
2
808
2133
Output:
818
2222
Solution
Approach
- Split the word into character list.
- Check the length and depending on if the list is Even or Odd.
- Add the first part of the list to the other half in reverse order.
- 1234333 -> 1234321
- 5656 -> 5665
- Join the list and check if it greater than the original word.
- 1234321 is not greater than 1234333
- 5665 is greater than 5656. This is the answer.
- If yes then voila! you go the answer and if not.
- Increment the middle character and again repeat Step 3 – 5.
Code
import math def helper(word): word_new = '' # check is the length of character list is even or odd if len(word) % 2 == 1: for i in range(len(word)//2 + 1): word_new += str(word[i]) word_new += word_new[:len(word)//2 ][::-1] else: for i in range(len(word)//2): word_new += str(word[i]) word_new += word_new[::-1] return word_new def solve(word, n): string = ''.join([str(x) for x in word]) z = helper(word) if z > string: return z else: # increase the middle character(s) and return the pallindrome inc = 1 for i in range(math.ceil(len(word)/2) - 1,-1,-1): word[i] += inc inc = word[i]//10 word[i] %= 10 return helper(word) N = int(input()) for i in range(N): word = list(map(int, input())) word_len = len(word) # for cases like '999','99999' if len(set(word))==1 and word[0]==9: print('1'+'0'*(word_len-1)+'1') else: print(solve(word, word_len))
Question Link – Link