564. 寻找最近的回文数

给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。

“最近的”定义为两个整数差的绝对值最小。

示例 1:

输入: "123"
输出: "121"

注意:

    n 是由字符串表示的正整数,其长度不超过18。
    如果有多个结果,返回最小的那个。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-closest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  这道题目我个人认为没有太多花里胡哨的东西。首先读题,我们能够获取如下信息:

  1、n是正整数,因此规避了0、空这种情况。

  2、若n本身就是一个回文串,则需要重新构造一个回文串。

  3、最近指的是差的绝对值最小,这样就导致了存在三种构造方式:进位、退位、同位。

         所谓进位指的是原本n是3位数,所构造的回文数为4位数,由于有最近约束,显然进且仅当n为9999*时才会引发此种操作,那么相应的回文数也很简单即为n+2.

    所谓退位构造指的是n原本是3位数,所构造的回文数变成了2位数,这种情况没有什么必然的,当同位构造无法满足时将会引起退位构造,而所构造的也必然是999*。

    所谓同位构造指的是n原本是3位数,所构造的回文数也是3位数。这种情况最常见。

  依据所获取的信息实际上就可以进行编码了。但是需要注意的是,在同位构造的时候需要考虑集中情况,例如数字12189构造时可以是12121也可以是12221甚至可以是12021。对于一个数字n,到底是哪一种,需要依据距离判断。

public String nearestPalindromic(String n) {
        if(n == null || n.length() == 0)
            return null;
     long ori = Long.parseLong(n);
if(n.length()==1) {return String.valueOf(ori -1); } StringBuilder ans = new StringBuilder(); char[] ch = n.toCharArray(); /*实际上构造回文分为三种情况, 分别是 退位,同位,进位,分别比较*/ long back = 9; for(int i =2;i<ch.length;i++){ back *= 10; back += 9; } long backLength = Long.parseLong(n) - back; /*此时解决9999这类的*/ boolean flag = true; for(int i=0;i<ch.length;i++){ if(ch[i] !='9'){ /*说明不需要进位构造*/ flag = false; break; } } if(flag) { return String.valueOf(ori +2); } /*同位构造。需要排除自己本身就是回文串的情况*/ char[] same = new char[ch.length]; same = Arrays.copyOfRange(ch, 0, ch.length); int left = 0; int right = ch.length -1; while(left<right){ same[right] = same[left]; right--; left++; } long sameNum = Long.parseLong(new String(same)); long sameLength = Math.abs(Long.parseLong(n) - sameNum); sameLength = sameLength==0?Long.MAX_VALUE:sameLength; /*此处检测所构造的是否为最近的回文串*/ int div = 0; long line = 0; if((same.length & 0x01) == 1){ div = ch.length/2; line = (long) Math.pow(10,div); }else { div = ch.length/2; line = (long) (11*Math.pow(10, div-1)); } if(same[div] >='1'){ long temp = Long.parseLong(new String(same)) - line; long tempLength = ori - temp; if(tempLength<=sameLength){ sameLength = tempLength; sameNum = temp; } } if(same[div] < '9'){ long temp = Long.parseLong(new String(same)) + line; long tempLength = temp - ori; if(tempLength < sameLength){ sameLength = tempLength; sameNum = temp; } } return (backLength<=sameLength?String.valueOf(back):String.valueOf(sameNum)); }
原文地址:https://www.cnblogs.com/establish/p/12637902.html