564 - Find the Closest Palindrome

 JAVA

  • 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;
        }
    }

C++

  • 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;
        }
    };

Comments