Leetcode 寻找最近的回文数

是个高反对低赞的题,但是感觉学完这个,回文也就没问题了思路:

  1. 确定标准回文(标准回文数就是把例如12345>12321),下面的其他操作都是在这个基础之上展开的。
  2. 求距离最近的最大回文数
  3. 求距离最近的最小回文数

求最大回文数:

  • 对数组进行长度增加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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值