给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。
“最近的”定义为两个整数差的绝对值最小。
示例 1:
输入: “123”
输出: “121”
注意:
n 是由字符串表示的正整数,其长度不超过18。
如果有多个结果,返回最小的那个。
class Solution {
public:
string nearestPalindromic(string n) {
long len = n.size(), num = stol(n), res, minDiff = LONG_MAX;
unordered_set<long> s;
s.insert(pow(10, len) + 1);
s.insert(pow(10, len - 1) - 1);
long prefix = stol(n.substr(0, (len + 1) / 2));
for (long i = -1; i <= 1; ++i)
{
string pre = to_string(prefix + i);
string str = pre + string(pre.rbegin() + (len%2), pre.rend());
s.insert(stol(str));
}
s.erase(num);
for (auto a : s)
{
long diff = abs(a - num);
if (diff < minDiff)
{
minDiff = diff;
res = a;
} else if (diff == minDiff)
res = min(res, a);
}
return to_string(res);
}
};
可以证明以下结论: 如果n 的前半部分是整数N,那么它的解一定是 以下三者之一:
N-1 和 N-1的回文组成的数字。
N 和 N的回文组成的数字
N+1 和 N+1 的回文组成的数字
利用这个结论生成3个解,取最小就行。 例 1230XXX的解 是 1230321, 1229221, 1231321 中的一个。 过程中处理下奇偶数长度,N是9999 N是10000等等特殊值.