给一个字符串str,代表一个整数,找到除了这个数之外,绝对值和这个数相差最小的回文数。
给一个字符串str,代表一个整数,找到除了这个数之外,绝对值和这个数相差最小的回文数。
例如:
str = “123”
返回“121”
注意:假设字符串str一定能变成long类型
不一定将中间对称过来的数就是距离原数相差最小的,例如1998,对称过来后是1991,但距离其最近的数其实是2002
思路
1、先对数进行硬性回文得到a,即在中间位置,对左半部分逆序覆盖进右半部分
2、对比a与原的大小,如果比原大则只需再求一个比原小的数。如果比原小则只需再求一个比原大的数。如果相等则两个都要求。
1、找比他大的最近的回文数
a) 找到该数的中间位置
b) 对中间位置的左边+1,然后将0-左边逆序覆盖在原本的(0-左边+1)后面
c) 当+1后为10时溢出,此时进行进位,将再高一位的数+1,高一位数置0,再进行逆序拷贝覆盖。
当进位到数的最高位还不行时需要再提升一位,对整个数的位数+1
public static Long getBigHuiWenNum(Long raw) { char[] chs = String.valueOf(raw).toCharArray(); char[] res = new char[chs.length+1];//余留1位最高位,即0位置上是'0' res[0] = '0'; for(int i = 0;i<chs.length;i++) { res[i+1] = chs[i]; } int size = chs.length; for(int j = (size-1)/2+1;j>=0;j--) { if(++res[j] > '9') res[j] = '0'; else { break; } } int offset = res[0] == '1' ? 1:0; size = res.length; for(int i = size-1;i>=(size+offset)/2;i--) res[i] = res[size-i-offset]; return Long.valueOf(String.valueOf(res)); } public static Long getSmallHuiWenNum(Long raw) { char[] chs = String.valueOf(raw).toCharArray(); char[] res = new char[chs.length]; int size = res.length; for(int i =0;i<size;i++) res[i] = chs[i]; for(int j = (size -1)/2; j>=0;j-- ) { if(--res[j] < '0') res[j] = '9'; else { break; } } if(res[0] == '0') { res = new char[size-1]; for(int i = 0;i<res.length;i++) res[i] = '9'; return size==1?0:Long.parseLong(String.valueOf(res)); } for(int k = 0;k<size/2;k++) res[size-1-k] = res[k]; return Long.valueOf(String.valueOf(res)); }

浙公网安备 33010602011771号