回文数具有对称的特性,所以将数字从中间分开(左子串和右子串)来分析:
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])