LeetCode 564. 寻找最近的回文数
思路:思维
只需要考虑左半边,回文数的对称性。我们找左半边的第一个比它大的数和第一个比它小的数,同时,特判边界,从这五个数中找到与原数差最小的数
class Solution {
public:
string nearestPalindromic(string n) {
int len = n.size();
typedef long long LL;
LL x = stoll(n);
set<LL> S;
S.insert(pow(10, len) + 1);
S.insert(pow(10, len - 1) - 1);
LL m = stoll(n.substr(0, (len + 1) / 2));
for (LL i = m - 1; i <= m + 1; i ++ ) {
string a = to_string(i), b = a;
reverse(b.begin(), b.end());
if (len % 2)
S.insert(stoll(a + b.substr(1)));
else
S.insert(stoll(a + b));
}
S.erase(x);
LL res = 2e18;
for (auto& t : S)
if (abs(t - x) < abs(res - x))
res = t;
return to_string(res);
}
};