📌  相关文章
📜  最大回文不超过N,可以表示为两个3位数的乘积(1)

📅  最后修改于: 2023-12-03 15:26:25.765000             🧑  作者: Mango

最大回文不超过N,可以表示为两个3位数的乘积

概述

题目要求我们找到两个3位数的乘积最大但不超过N,且这个乘积是回文数。回文数是指正着和倒着都相同的数字。本文将介绍两种常用的解题方法:暴力枚举和优化枚举。

解法1:暴力枚举

暴力枚举是最朴素的解法,它通过遍历所有符合条件的情况,找到最大的符合条件的回文数。具体实现如下:

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),性能较低。

解法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),性能较高。

总结

本文介绍了两种常用的解题方法:暴力枚举和优化枚举。暴力枚举是最朴素的解法,但是它的时间复杂度较高,随着数据规模的增大,性能会受到影响;而优化枚举能够通过减少无效的枚举,提高算法效率,时间复杂度较低,性能较高。在实际开发中,我们应该根据具体情况选择不同的算法,尽可能提高代码的效率。