479. 最大回文数乘积

Posted 心脏dance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了479. 最大回文数乘积相关的知识,希望对你有一定的参考价值。

题目链接:力扣

思路:首先这个题我也是猜测了一下,就是n位数,最终的答案一定是2*n位数,我猜的。因为答案是2*n位数,这样的话我就枚举前n位数(从大到小),然后拼接后面n位数,得到一个2*n位数的回文。此时外层循环最大循环次数为1e8,然后里面就从得到的这个2*n位数下手,找到2个n位数的乘积是它就可以了,能找到就返回,找不到就接着找。内层循环就从最大的n位数到sqrt(2*n位的这个数) 或者从sqrt(2*n位的这个数)到最小的n位数(不知道为什么用sqrt作为一个枚举边界的可以自行学习,或者在底下评论,这里不做解释了),这两种(从大到小的循环方式)理论上都可以,但是后者会超时,搞不懂。内层的最大循环次数为1e8。所以最坏情况的时间复杂度为1e16。题目没说多少ms,1e16确实很离谱了。我一开是在7的时候就超时了,后来看了下题解,把内层循环换了下,就对了,换完时间复杂度也是1e16。所以说这题还要推算,正确答案大约是什么样子的。恶心啊!!!不过官方题解也没说怎么推算的~~~

注意:1的时候有错误,1位数的话,最大回文数乘积为1位数不是2位数。所以正好,所有判断结束后,如果没有返回值,说明输入的是1,所以最后返回9就可以了。

上代码:

import kotlin.math.pow
import kotlin.math.sqrt

class Solution 
    fun largestPalindrome(n: Int): Int 
        val maxNumLeft = 10.0.pow(n).toInt() - 1
        val minNumLeft = 10.0.pow(n - 1).toInt()
        for (i in maxNumLeft downTo minNumLeft) 
            var temp = i
            var result = i.toLong()
            while (temp != 0) 
                result = result * 10 + temp % 10
                temp /= 10
            
            for (j in maxNumLeft downTo sqrt(result.toDouble()).toInt()) 
                if (result % j == 0L && result / j >= minNumLeft && result / j <= maxNumLeft) 
                    return (result % 1337).toInt()
                
            
            /*
             // 这样写超时,有点意思昂,不太懂为什么~~,应该是正确答案离这种写法有点远
             for (j in sqrt(result.toDouble()).toInt() downTo minNumLeft) 
                if (result % j == 0L && result / j >= minNumLeft && result / j <= maxNumLeft) 
                    return (result % 1337).toInt()
                
            
             */
        
        return 9
    

以上是关于479. 最大回文数乘积的主要内容,如果未能解决你的问题,请参考以下文章

479 Largest Palindrome Product 最大回文数乘积

LeetCode 479 最大回文数乘积[暴力 枚举] HERODING的LeetCode之路

求两个三位数乘积的最大回文问题

使用两种方法来解决“最大回文数乘积”问题

使用两种方法来解决“最大回文数乘积”问题

最大回文乘积