是个高反对低赞的题,但是感觉学完这个,回文也就没问题了思路:
- 确定标准回文(标准回文数就是把例如12345>12321),下面的其他操作都是在这个基础之上展开的。
- 求距离最近的最大回文数
- 求距离最近的最小回文数
求最大回文数:
- 对数组进行长度增加1,就是在头部增加一个位置,然后把这个位置令为0,然后对len/2之前第一个元素开始加1,如果不大于9就停止,返回这个数的标准回文即可,如果大于9,继续对前面元素加1,然后重复即可。
求最小回问:
- 不增加空间,从len-1/2这个位置开始,向前进行-1的操作,如果当前变成小于0的数,直接令为9,否则循环停止,但是注意,如果循环结束,第一个位置是0,那么要有两种后续处理:1.如果size=1,直接返回0。2.如果size不等1,就size-1,然后数组全部复制为9.
class Solution {
public String nearestPalindromic(String n) {
long num=Long.valueOf(n);
long biaozhun=getBZ(n);
long big=num>=biaozhun?getBig(n):biaozhun;
long small=num<=biaozhun?getSmall(n):biaozhun;
return big-num>=num-small?String.valueOf(small):String.valueOf(big);
}
public long getBZ(String str){
char[] chs=str.toCharArray();
for(int i=0,j=chs.length-1;i<chs.length/2;i++,j--){
chs[j]=chs[i];
}
return Long.valueOf(String.valueOf(chs));
}
public long getBig(String str){
char[] chs=str.toCharArray();
char[] chs1=new char[chs.length+1];
chs1[0]='0';
for(int i=1;i<chs1.length;i++){
chs1[i]=chs[i-1];
}
for(int i=chs1.length/2;i>=0;i--){
if(++chs1[i]>'9'){
chs1[i]='0';
}else break;
}
int length=chs1[0]=='0'?chs1.length-1:chs1.length;
if(length==chs1.length){
return getBZ(String.valueOf(chs1));
}
String s="";
for(int i=1;i<chs1.length;i++){
s=s+chs1[i];
}
return getBZ(s);
}
public long getSmall(String str){
char[] chs=str.toCharArray();
for(int i=(chs.length-1)/2;i>=0;i--){
//这里必须是(chs.length-1)/2,对于1,2,3,4和1,2,3,4,5不管是他俩谁我都能取到第一个的2和第二个的三 那就必须len-1/2 这个记住
if(--chs[i]<'0'){
chs[i]='9';
}else break;
}
if(chs[0]=='0'){
if(chs.length==1){
return 0;
}
char[] res=new char[chs.length-1];
for(int i=0;i<res.length;i++){
res[i]='9';
}
return getBZ(String.valueOf(res));
}
return getBZ(String.valueOf(chs));
}
}