LeetCode 564: Find the Closest Palindrome

MathString

Problem Description

Explanation

To find the closest palindrome to a given integer represented as a string, we can follow these steps:

  1. Convert the input string to a long integer.
  2. Find the nearest smaller and nearest larger palindrome numbers.
  3. Calculate the absolute differences between the input number and the two palindrome numbers.
  4. Return the palindrome number with the smallest absolute difference. If there is a tie, return the smaller palindrome number.

Time Complexity: O(n) where n is the length of the input string. Space Complexity: O(1)

Solutions

class Solution {
    public String nearestPalindromic(String n) {
        long num = Long.parseLong(n);
        long smaller = findSmallerPalindrome(num);
        long larger = findLargerPalindrome(num);
        
        return String.valueOf(smaller - num <= num - larger ? smaller : larger);
    }
    
    private long findSmallerPalindrome(long num) {
        String str = String.valueOf(num);
        String half = str.substring(0, (str.length() + 1) / 2);
        String smallerHalf = String.valueOf(Long.parseLong(half) - 1);
        boolean evenLen = str.length() % 2 == 0;
        String smallerPalindrome = evenLen ? smallerHalf + new StringBuilder(smallerHalf).reverse().toString() : smallerHalf + new StringBuilder(smallerHalf.substring(0, smallerHalf.length() - 1)).reverse().toString();
        
        return Long.parseLong(smallerPalindrome);
    }
    
    private long findLargerPalindrome(long num) {
        String str = String.valueOf(num);
        String half = str.substring(0, (str.length() + 1) / 2);
        String largerHalf = String.valueOf(Long.parseLong(half) + 1);
        boolean evenLen = str.length() % 2 == 0;
        String largerPalindrome = evenLen ? largerHalf + new StringBuilder(largerHalf).reverse().toString() : largerHalf + new StringBuilder(largerHalf.substring(0, largerHalf.length() - 1)).reverse().toString();
        
        return Long.parseLong(largerPalindrome);
    }
}

Loading editor...