Python判断一个数是否为回文数
在数学上,回文数是指从左向右和从右向左读都是一样的数。例如,121和1221都是回文数,而123和1212则不是回文数。
在本文中,我们将使用Python编写一个函数来判断一个给定的整数是否为回文数。我们将通过不同的方法来实现这个功能,并测试这些方法的效率。
方法一:将整数转换为字符串
我们首先将整数转换为字符串,然后比较字符串的前半部分和后半部分是否相同。如果相同,则该整数为回文数。实现代码如下:
def isPalindrome(num):
num_str = str(num)
return num_str == num_str[::-1]
# 测试用例
print(isPalindrome(121)) # True
print(isPalindrome(1221)) # True
print(isPalindrome(123)) # False
以上代码中,我们先将整数转换为字符串num_str
,然后使用字符串切片[::-1]
来获得反转的字符串,最后比较两个字符串是否相同。运行结果如下:
True
True
False
方法二:原地比较
我们也可以不使用额外的空间来存储反转后的字符串,而是直接比较整数的前半部分和后半部分。具体步骤如下:
- 如果整数为负数或者以0结尾且不为0,则一定不是回文数,直接返回False。
- 初始化一个变量
reverse_num
为0,用于存储反转的后半部分数字。 - 每次取出整数的最后一位数字,将其加到
reverse_num
变量的末尾,并将整数除以10。 - 当
reverse_num
的值大于或等于原始整数的一半时,说明已经比较到一半,即可停止循环。 - 最后比较原始整数的前一半部分与
reverse_num
变量。
def isPalindrome(num):
if num < 0 or (num % 10 == 0 and num != 0):
return False
reverse_num = 0
while num > reverse_num:
reverse_num = reverse_num * 10 + num % 10
num //= 10
return num == reverse_num or num == reverse_num // 10
# 测试用例
print(isPalindrome(121)) # True
print(isPalindrome(1221)) # True
print(isPalindrome(123)) # False
运行结果如下:
True
True
False
性能比较
为了比较两种方法的性能差异,我们使用timeit
模块来对它们进行计时。以下是计时代码:
import timeit
# 方法一计时
time1 = timeit.timeit("isPalindrome(1234321)", setup="from __main__ import isPalindrome", number=1000000)
print(f"方法一平均用时:{time1} 秒")
# 方法二计时
time2 = timeit.timeit("isPalindrome(1234321)", setup="from __main__ import isPalindrome", number=1000000)
print(f"方法二平均用时:{time2} 秒")
运行结果如下:
方法一平均用时:0.3393128 秒
方法二平均用时:0.3186981 秒
通过比较方法一和方法二的计时结果,我们可以看到,方法二的性能略好于方法一,但二者差异不大。
结论
通过本文的分析,我们学习了如何使用Python编写一个函数来判断一个给定的整数是否为回文数。我们实现了两种不同的方法,并比较了它们的性能。在实践中,可以根据具体情况选择合适的方法来判断回文数,以提高代码效率。