题目链接:
力扣https://leetcode-cn.com/problems/find-the-closest-palindrome/
【分析】这道题要求找到和原数字绝对差值最小的回文数,我们很自然的想到保留高位改变低位,也就是把前半部分折叠过来。也就是把abcde变成abcba,但是如果本身就是回文串这样折叠过来还是自身。所以要考虑把(abc-1)或者(abc+1)折叠。但是对于99999这种的,生成的会是1000001和99899,但实际最接近的是100001;对于10001这种的生成的是10101和999,实际最小是9999,所以对于长度为n的数还要考虑10^n+1和10^(n-1)-1。
class Solution {
public String nearestPalindromic(String n) {
int m = n.length();
long org = Long.parseLong(n);
Set<Long> set = new HashSet<>();
set.add((long)Math.pow(10, m - 1) - 1);
set.add((long)Math.pow(10, m) + 1);
long mid = Long.parseLong(n.substring(0, (m + 1) / 2));
for(long i = mid -1; i <= mid + 1; i++){
StringBuilder sb = new StringBuilder();
StringBuilder pre = new StringBuilder(String.valueOf(i));
sb.append(pre);
if(m % 2 == 0) sb.append(pre.reverse());
else sb.append(pre.reverse().substring(1));
set.add(Long.parseLong(sb.toString()));
}
long ans = -1;
for(Long i: set){
if(i == org) continue;
if(ans == -1) ans = i;
else if(Math.abs(i - org) < Math.abs(ans - org)) ans = i;
else if(Math.abs(i - org) == Math.abs(ans - org) && i < ans) ans = i;
}
return String.valueOf(ans);
}
}