479 最大回文数乘积(暴力枚举)

1. 问题描述:

你需要找到由两个 n 位数的乘积组成的最大回文数。
由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。
示例:
输入: 2
输出: 987
解释: 99 x 91 = 9009, 9009 % 1337 = 987
说明:
n 的取值范围为 [1,8]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-palindrome-product

2. 思路分析:

分析题目可以知道最容易想到的思路是暴力枚举,这里使用到的一个技巧是每一次不是枚举两个数字然后再判断是否是回文数这里我们可以从大到小枚举回文数,也即从大到小枚举答案这样当我们找到两个n位数相乘的回文数之后可以直接返回。我们可以先生成当前n位数的最大值,将其转换为字符串之后得到a,将a翻转之后可以得到字符串b,那么num = a + b就是当前最大的回文串,使用一个循环来枚举能够凑成num的两个数字,可以枚举较大的那个数字,设较大的那个数字为a1,较小的数字为b1,则a1 >= b1,那么循环的条件为a1 * a1 >= num,因为如果a1 * b1能够拼成num,那么必然存在a1 * a1 >= a1 * b1 = num。

3. 代码如下:

class Solution:
    def largestPalindrome(self, n: int) -> int:
        # 当n = 1的时候只有3 * 3 = 9才是回文数其余的都不是
        if n == 1: return 9
        # maxv为n位数字的最大值
        maxv = 10 ** n - 1
        i = maxv
        while i:
            a = str(i)
            b = a[::-1]
            num = int(a + b)
            j = maxv
            # j * j要大于num才枚举
            while j * j >= num:
                if num % j == 0:
                    return num % 1337
                j -= 1
            i -= 1
        return 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值