开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情
1. 算法描述
- “回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
- 设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。 回文数是指正序(从左向右)和倒序(从右向左)都是一样的整数。例如,1221是回文,而1222不是。
- 注意:
- 1.偶数个的数字也有回文数124421
- 2.小数没有回文数
2. 回文数算法
随意找一个十进制的数,把它倒过来成另一个数,再把这两个数相加,得一个和数,这是第一步;然后把这个和数倒过来,与原来的和数相加,又得到一个新的和数,这是第二步。照此方法,一步步接续往下算,直到出现一个“回文数”为n。例如:28+82=110,110+011=121,两步就得出了一个“回文数”。如果接着算下去,还会得到更多的“回文数”。这个过程称为“196算法”。
3. 算法思路
- 解法一:通过逆转字符串进行比对
- 解法二:反转一半数字和前半部分的数字进行比较
4. 代码实现
字符串逆转法
通过字符串切片进行逆转
实现代码📝:
def is_palindrome(x):
# 如果x为负数肯定不是,x末尾是0也不是
if x<0 or x >0 and x%10==0:
return False
str_x = str(x)
return str_x ==str_x[::-1] # 用切片逆转
print(is_palindrome(1221))
print(is_palindrome(1220))
运行结果:
反转一半数字
- 对于整数x,后半部分reverted
- 每次循环×%10拿到末尾数字
- 然后×l/ 10去除末尾的数字
- 循环结束条件x<= reverted
![]()
实现代码📝:
def is_palindrome(x):
# 如果x为负数肯定不是,x末尾是0也不是
if x < 0 or x > 0 and x % 10 == 0:
return False
reverted = 0 # 保存逆转后的后半份数字
while x > reverted:
reverted = reverted * 10 + x % 10
x //= 10 # 整除10
return x == reverted or x == reverted // 10
print(is_palindrome(1221))
print(is_palindrome(1220))
运行结果👇: