564. Find the Closest Palindrome
https://leetcode.com/problems/find-the-closest-palindrome/description/
找与给定数值n最相近的回文数。分为三种情况:
比n多一位: 99->101
比n少一位: 101->99
和n位数一样。为了和n尽量靠近,前半边不能动,否则数会差很大,让后半边和前半边一致。此时如果n本身就是回文的话,要把中间数调高1或降低1。
把这三种情况以及子情况全检查一遍,找出差值最小且数是最小的。
答案参考了这。
/*
* @lc app=leetcode id=564 lang=cpp
*
* [564] Find the Closest Palindrome
*/
// @lc code=start
class Solution {
public:
string nearestPalindromic(string n) {
const int L = n.size();
unordered_set<long> candidates;
// 多一位数字,10...01
candidates.insert(pow(10, L) + 1);
// 少一位数字,99...99或0
candidates.insert(pow(10, L - 1) - 1);
// prefix + Mid + reverse(prefix)
// Mid = {mid -1, mid, mid + 1}
long prefix = stol(n.substr(0, (L + 1) / 2));
for (long i = -1; i <= 1; ++i) {
string p = to_string(prefix + i);
string pp = p + string(p.rbegin() + (L & 1), p.rend());
candidates.insert(stol(pp));
}
long num = stol(n), min_diff = LONG_MAX, res = 0;
candidates.erase(num);
for (auto c : candidates) {
long diff = abs(c - num);
if (diff < min_diff) {
res = c;
min_diff = diff;
} else if (diff == min_diff) {
res = min(res, c);
}
}
return to_string(res);
}
};
// @lc code=end
Last updated
Was this helpful?