Skip to main content

Next Smallest Palindrome

Given a number, we have to find the next smallest palindrome which is larger than this number. 

The input can be large. We'll store the input in an array. e.g. if input is  1259,
array will be, int k[]= {1,2,5,9}
To find the next smallest palindrome, we have to generalize the input. There can be three types of input.  
  1. All digits are 9. e.g. 999
  2. Input is not a palindrome. e.g 12942
  3. The input itself a palindrome number. e.g. 1221
Algorithm for the first type is easy. Expand the array length by one and put boundary digits as 1 & all other digits will be 0. 
Input:   999
Output: 1001
 
Left half & Right half: Using example, left half of 522665 is, 522 & left half of 52123 is 52. Right half of 522665 is 665 & right half of 52123 is 23.  

Iteration: We'll compare between left half and right half, starting from middle. For example, two variable i and j will indicate to 2 & 4 respectively, if the input is 1 2 2 4 2 and i and j will indicate to 9 & 3 respectively if the input is 5 6 9 3 2 5. For each iteration i will decrement and j will increment.

Comparison outcomes.
  • k[i] == k[j] if this is true, do nothing.
  • k[i] > k[j] if this is true, then stop comparing and just copy left half to right half.
  • k[i] < k[j] if this is true, follow the procedure below.

Add and Copy: Add 1 to middle digit & propagate carry to the left half and simultaneously copy left half to right half.
Input: 5 2 1 1 6 5
n is even. so middle digit is 1 of left half. Perform (1+1) . 
summation 2, carry 0.
X X 2 2 X X
2 2 2 2 X
5 2 2 2 2 5

Output: 5 2 2 2 2 5
Input: 1 2 9 4 5
middle digit is 9. add 1 to it. propagate carry to left half and copy to right half simultaneously.
X X 0 X X
 X 3 0 3 X
1 3 0 3 1
Output: 1 3 0 3 1

#type 3: For all iterations, k[i] == k[j]. It means the input is palindromic. To find the next smallest palindrome, follow the same procedure as before. add 1 to middle digit and copy from left to right simultaneously. 















Comments

Popular posts from this blog

SPOJ - GSS1

Considering input series: { 4 , -10 , 3 , 100 , -20 , 1 } Query(x,y) = Max { a[i]+a[i+1]+...+a[j] ; x ≤ i ≤ j ≤ y } A node contains-  [ START & END is a node's segment limit ] Prefix is the maximum sum starting at START, end can be anywhere. There are two possibilities of the maximum. One, node's leftChild's prefix or two, adding leftChild's sum + rightChild's prefix. (which will make the prefix contiguous) Suffix is the maximum sum ending at END, start can be anywhere. There's two possibility of the maximum. One, node's rightChild's already calculated suffix or two, add rightChild's sum + leftChild's suffix   (which will make the suffix contiguous). Sum : leftChild's sum + rightChild's sum. MAX Maximum of  -  prefix (result is in the node, starts from START but doesn't end in END ) suffix  (result is in the node, doesn't start from START but surely ends in END ) leftChild's max ( result is in left ...

SPOJ 95 - STPAR - Street Parade

Problem Statement Heuristics:   Let, N be the number which is next in fixed order. Take an input X , if it is equal to N then next number will be n++. If not, then search for N in the side lane and after finishing the search, put X in the side lane. After all X is processed but N is not found in either X or side lane, then the order is not possible. Solution:

SPOJ-PIGBANK | Unbounded Knapsack ( Minimization)

Unbounded Knapsack : Given a knapsack weight W and a set of N items with certain value Vi and weight W i , we need to calculate minimum amount that could make up this quantity exactly. To have a more clear understanding of this problem, see SPOJ-PIGBANK Sample Problem : We're given a box which can hold maximum W weight. There are N various coins each of value Vi and Weight Wi. We need to fill the box with total W weight with any number of coins of any value. Note that coins are unlimited.  100 ----- W 2 ------- N 1 1 ----- vi,wi 30 50 --- vi,wi Answer of the problem above is, 60. If we take 2 coins of value 30, weight 50, we'll get exactly weight 100 with a minimum value of 60. Algorithm : This is a DP solution. To get the solution for W=100, we'll solve subproblems first. Let dp[W+1]  be an array which will store the subproblems solutions. In the end, dp[W] will give us the minimum amount. Subproblems soultion will be the minimum of taking the coin Vk ...