📅  最后修改于: 2023-12-03 15:26:25.765000             🧑  作者: Mango
题目要求我们找到两个3位数的乘积最大但不超过N,且这个乘积是回文数。回文数是指正着和倒着都相同的数字。本文将介绍两种常用的解题方法:暴力枚举和优化枚举。
暴力枚举是最朴素的解法,它通过遍历所有符合条件的情况,找到最大的符合条件的回文数。具体实现如下:
def largest_palindrome(n):
largest = 0
for i in range(100, 1000):
for j in range(100, 1000):
product = i * j
if product < n and str(product) == str(product)[::-1] and product > largest:
largest = product
return largest
上述代码中,我们通过两个for循环遍历所有的3位数,计算它们的乘积,判断是否符合回文数条件以及是否小于N,并与当前的最大回文数比较大小,最终返回最大的回文数。时间复杂度为O(n^2),性能较低。
优化枚举的思路是尽量减少无效的枚举,以此提高算法的效率。具体实现如下:
def largest_palindrome(n):
largest = 0
for i in range(990, 99, -11):
for j in range(999, 99, -1):
product = i * j
if product < n and str(product) == str(product)[::-1] and product > largest:
largest = product
if product < largest:
break
if i*j < largest:
break
return largest
上述代码中,我们通过两个for循环遍历所有i和j的可能取值,但是我们注意到,回文数的性质是它是对称的,所以我们每次枚举i以11为步长递减,而每次枚举j递减1。这样既能保证i和j的差值最小,也能减少无效的枚举。同时,我们加入了两个break条件,如果当前的乘积已经小于当前的最大回文数largest,就退出内部循环;如果当前的i*j已经小于最大回文数largest,就退出外部循环。这些小优化都能提升我们的算法效率。时间复杂度为O(n),性能较高。
本文介绍了两种常用的解题方法:暴力枚举和优化枚举。暴力枚举是最朴素的解法,但是它的时间复杂度较高,随着数据规模的增大,性能会受到影响;而优化枚举能够通过减少无效的枚举,提高算法效率,时间复杂度较低,性能较高。在实际开发中,我们应该根据具体情况选择不同的算法,尽可能提高代码的效率。