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 最大回文数乘积