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
Post a Comment