下一个回文数(百度实习面试)

回文数具有对称的特性,所以将数字从中间分开(左子串和右子串)来分析:
A.数字为个位数,不能分子串。
--------1.数字为9,直接返回11
--------2.数字小于9,直接++
B.数字可以分为左右子串
--------1.数字有奇数位
----------------a.左子串翻转后大于右字串,右子串 = 左字串翻转
----------------b.左子串翻转后小于等于右字串
------------------------1.中间位 == 9(需要进位),左字串加一,mid(0),右子串=左字串+1的翻转
------------------------2.否则,mid+1,右字串 = 左字串的翻转
--------2.数字有偶数位
----------------a.左子串翻转后大于右字串,右子串 = 左字串翻转
----------------b.左子串翻转后小于等于右字串,左字串+1,右子串=左子串+1的翻转

def Next_Palindrome_Num(x):
    if x >= 0 and x < 9:
        return x + 1
    elif x == 9:
        return 11
    # x不是个位数
    numstr = str(x)
    numlen = len(numstr)
    if numlen % 2:      #x是奇数位
        leftstr, rightstr, mid = numstr[:numlen // 2], numstr[numlen // 2 + 1:], numstr[numlen // 2]
        newstr = leftstr[::-1]
        if int(newstr) > int(rightstr):
            return int(leftstr + mid + newstr)
        else:
            if mid != "9":
                return int(leftstr + str(int(mid) + 1) + newstr)
            else:
                mid = "0"
                newleft = str(int(leftstr) + 1)
                return int(newleft + mid + newleft[::-1])
    else:   			#x是偶数位
        leftstr, rightstr = numstr[:numlen//2], numstr[numlen//2:]
        print(leftstr+" "+rightstr)
        newstr = leftstr[::-1]
        if int(newstr) > int(rightstr):
            return int(leftstr+newstr)
        else:
            tmp = int(leftstr)+1
            return int(str(tmp)+str(tmp)[::-1])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值