给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。
“最近的”定义为两个整数差的绝对值最小。
示例 1:
输入: "123"
输出: "121"
注意:
n 是由字符串表示的正整数,其长度不超过18。
如果有多个结果,返回最小的那个。
思路:2019年最后一天,发个博客纪念一下,这道题不难,处理下相应情况即可。
class Solution {
private long mins;
private long vals;
private long nowVal;
public String nearestPalindromic(String n) {
int len=n.length(),tmp=0;
long val=Long.valueOf(n);
long nowVal2=0,nowVal3=1;
this.vals=val;
mins=Integer.MAX_VALUE;
for(int i=0;i<len-1;i++) nowVal2=nowVal2*10+9;
for(int i=0;i<len;i++) nowVal3=nowVal3*10; nowVal3+=1;
if(len==0) return "";
if(len==1) {
tmp=n.charAt(0)-'0';
tmp-=1;
if(tmp<0) tmp+=2;
return (char)(tmp+'0')+"";
}
int p=jud(n);
char[] c=n.toCharArray();
//System.out.println(p);
if(p!=-1) dfs(c,p,c.length-1-p);
else work1(c);
//System.out.println(mins);
if(Math.abs(val-nowVal)<Math.abs(val-nowVal2)) {
if(Math.abs(val-nowVal)>Math.abs(val-nowVal3))
return String.valueOf(nowVal3);
return String.valueOf(nowVal);
}
else {
if(Math.abs(val-nowVal2)>Math.abs(val-nowVal3))
return String.valueOf(nowVal3);
return String.valueOf(nowVal2);
}
}
private void work1(char[] c) {
int len=c.length;
if(len%2==0) {
int tmp=c[len/2-1]-'0';
tmp-=1;
if(tmp<0) tmp+=2;
c[len/2-1]=c[len/2]=(char)(tmp+'0');
}
else {
int tmp=c[len/2]-'0';tmp-=1;
if(tmp<0) tmp+=2;
c[len/2]=(char)(tmp+'0');
}
nowVal=work(c);
}
private void dfs(char[] c,int l,int r) {
if(l>r) {
//System.out.println(c);
if(jud(String.valueOf(c))==-1) {
long x=work(c);
//System.out.println(x);
if(x==vals) return;
if(mins>=Math.abs(x-vals)) {
if(mins==Math.abs(x-vals))
nowVal=Math.min(x, nowVal);
else
nowVal=x;
mins=Math.abs(x-vals);
}
}
return;
}
char tmp=c[l],tmp1=c[r];
c[r]=c[l];
dfs(c,l+1,r-1);
c[l]=c[r]=(char)('0'+(tmp-'0'+1));
if(c[l]<='9') dfs(c,l+1,r-1);
c[l]=c[r]=(char)('0'+(tmp-'0'-1));
//System.out.println(l+" "+c[l]+" "+c[r]);
if(c[l]>'0' || c[l]=='0' && l>0) dfs(c,l+1,r-1);
c[l]=tmp;c[r]=tmp1;
//dfs(c,l+1,r-1);
}
private long work(char[] c) {
long res=0;
for(int i=0;i<c.length;i++)
res=res*10+c[i]-'0';
return res;
}
private int jud(String str) {
int l=0,r=str.length()-1;
while(l<r) {
if(str.charAt(l)!=str.charAt(r))
return l;
l++;r--;
}
return -1;
}
}