Welcome to Subscribe On Youtube

564. Find the Closest Palindrome

Description

Given a string n representing an integer, return the closest integer (not including itself), which is a palindrome. If there is a tie, return the smaller one.

The closest is defined as the absolute difference minimized between two integers.

 

Example 1:

Input: n = "123"
Output: "121"

Example 2:

Input: n = "1"
Output: "0"
Explanation: 0 and 2 are the closest palindromes but we return the smallest which is 0.

 

Constraints:

  • 1 <= n.length <= 18
  • n consists of only digits.
  • n does not have leading zeros.
  • n is representing an integer in the range [1, 1018 - 1].

Solutions

  • class Solution {
        public String nearestPalindromic(String n) {
            long x = Long.parseLong(n);
            long ans = -1;
            for (long t : get(n)) {
                if (ans == -1 || Math.abs(t - x) < Math.abs(ans - x)
                    || (Math.abs(t - x) == Math.abs(ans - x) && t < ans)) {
                    ans = t;
                }
            }
            return Long.toString(ans);
        }
    
        private Set<Long> get(String n) {
            int l = n.length();
            Set<Long> res = new HashSet<>();
            res.add((long) Math.pow(10, l - 1) - 1);
            res.add((long) Math.pow(10, l) + 1);
            long left = Long.parseLong(n.substring(0, (l + 1) / 2));
            for (long i = left - 1; i <= left + 1; ++i) {
                StringBuilder sb = new StringBuilder();
                sb.append(i);
                sb.append(new StringBuilder(i + "").reverse().substring(l & 1));
                res.add(Long.parseLong(sb.toString()));
            }
            res.remove(Long.parseLong(n));
            return res;
        }
    }
    
  • class Solution {
    public:
        string nearestPalindromic(string n) {
            long x = stol(n);
            long ans = -1;
            for (long t : get(n))
                if (ans == -1 || abs(t - x) < abs(ans - x) || (abs(t - x) == abs(ans - x) && t < ans))
                    ans = t;
            return to_string(ans);
        }
    
        unordered_set<long> get(string& n) {
            int l = n.size();
            unordered_set<long> res;
            res.insert((long) pow(10, l - 1) - 1);
            res.insert((long) pow(10, l) + 1);
            long left = stol(n.substr(0, (l + 1) / 2));
            for (long i = left - 1; i <= left + 1; ++i) {
                string prefix = to_string(i);
                string t = prefix + string(prefix.rbegin() + (l & 1), prefix.rend());
                res.insert(stol(t));
            }
            res.erase(stol(n));
            return res;
        }
    };
    
  • class Solution:
        def nearestPalindromic(self, n: str) -> str:
            x = int(n)
            l = len(n)
            res = {10 ** (l - 1) - 1, 10**l + 1}
            left = int(n[: (l + 1) >> 1])
            for i in range(left - 1, left + 2):
                j = i if l % 2 == 0 else i // 10
                while j:
                    i = i * 10 + j % 10
                    j //= 10
                res.add(i)
            res.discard(x)
    
            ans = -1
            for t in res:
                if (
                    ans == -1
                    or abs(t - x) < abs(ans - x)
                    or (abs(t - x) == abs(ans - x) and t < ans)
                ):
                    ans = t
            return str(ans)
    
    
  • func nearestPalindromic(n string) string {
    	l := len(n)
    	res := []int{int(math.Pow10(l-1)) - 1, int(math.Pow10(l)) + 1}
    	left, _ := strconv.Atoi(n[:(l+1)/2])
    	for _, x := range []int{left - 1, left, left + 1} {
    		y := x
    		if l&1 == 1 {
    			y /= 10
    		}
    		for ; y > 0; y /= 10 {
    			x = x*10 + y%10
    		}
    		res = append(res, x)
    	}
    	ans := -1
    	x, _ := strconv.Atoi(n)
    	for _, t := range res {
    		if t != x {
    			if ans == -1 || abs(t-x) < abs(ans-x) || abs(t-x) == abs(ans-x) && t < ans {
    				ans = t
    			}
    		}
    	}
    	return strconv.Itoa(ans)
    }
    
    func abs(x int) int {
    	if x < 0 {
    		return -x
    	}
    	return x
    }
    
  • /**
     * @param {string} n
     * @return {string}
     */
    
    function nearestPalindromic(n) {
        const x = BigInt(n);
        let ans = null;
    
        for (const t of getCandidates(n)) {
            if (
                ans === null ||
                absDiff(t, x) < absDiff(ans, x) ||
                (absDiff(t, x) === absDiff(ans, x) && t < ans)
            ) {
                ans = t;
            }
        }
    
        return ans.toString();
    }
    
    function getCandidates(n) {
        const length = n.length;
        const res = new Set();
    
        res.add(BigInt(Math.pow(10, length - 1) - 1));
        res.add(BigInt(Math.pow(10, length) + 1));
    
        const left = BigInt(n.substring(0, Math.ceil(length / 2)));
    
        for (let i = left - 1n; i <= left + 1n; i++) {
            const prefix = i.toString();
            const t =
                prefix +
                prefix
                    .split('')
                    .reverse()
                    .slice(length % 2)
                    .join('');
            res.add(BigInt(t));
        }
    
        res.delete(BigInt(n));
        return res;
    }
    
    function absDiff(a, b) {
        return a > b ? a - b : b - a;
    }
    
    

All Problems

All Solutions