题目信息
给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。
“最近的”定义为两个整数差的绝对值最小。
示例 1:
输入: n = "123"
输出: "121"
示例 2:
输入: n = "1"
输出: "0"
解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。
思路
更具体的思路见代码注释
代码
/**
* 每一个数有五种可能的情况 假设这个数是 abcde 因为是回文数,所以只需要看前一半
* 1: ab(c-1)ba 2: ab(c+1)ba 3 abcba 4: 1e4-1 5:1e5+1
* 4、5 的例子 假设 一个数 9999 4的例子就是 9889 5:10001
* 最终在这五个数中取绝对值的最小值
*/
class Solution {
public String nearestPalindromic(String n) {
int len=n.length ();
Set<Long> s=new HashSet<> ();
//加入4,5两种情况
s.add ((long)Math.pow (10,len)+1);
s.add ((long)Math.pow (10,len-1)-1);
// 得到这个数的前一半 注意要上取整
long m=Long.parseLong (n.substring (0,(len+1)/2));
//找情况1、2、3
for (long i=m-1;i<=m+1;i++){
//准备第一部分 假设他是 12345 就只要 123
String str1=String.valueOf (i);
//第二部分
StringBuilder str2=new StringBuilder (str1);
str2.reverse ();
//12345这个例子是奇数,str1长度是3,str2长度是2。原来的字符串也可能是偶数
if(len%2==0){
s.add (Long.valueOf (str1+str2.toString ()));
}
//奇数的情况,去掉str2的第一位 321 去掉3
else {
s.add(Long.valueOf (str1+str2.substring (1,str2.length ()).toString ()));
}
}
//题目要求最终结果是不含自己的,所以去掉
long se=Long.valueOf (n);
s.remove (se);
//找绝对值最小的
long res=Long.MAX_VALUE;
for(long x:s){
if(Math.abs (x-se)<Math.abs (res-se)||(Math.abs (x-se)==Math.abs (res-se) && x<res)){
res=x;
}
}
return String.valueOf (res);
}
}