给一个字符串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));
    }

 

posted @ 2021-02-24 14:13  γGama  阅读(124)  评论(0)    收藏  举报