题目
给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。
示例 1:
输入:n = 2
输出:987
解释:99 x 91 = 9009, 9009 % 1337 = 987示例 2:
输入: n = 1
输出: 9提示:
1 <= n <= 8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-palindrome-product
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
从大值开始枚举回文数,判断是否可以拆成两个n位数乘积。
比如,n=2,最大的两位数为99,从99开始构造回文数,左边为99时右边也是99,回文为9999,不过其大于,因此跳过。继续看98,回文数为9889,也大于
,跳过。再看97,9779不超过
,但是无法表示为两个两位数乘积,继续看96,95,…,直至找到一个可以拆成两个n位数的回文数。
代码
class Solution {public int largestPalindrome(int n) {// n为1时,不适用下面的算法,单独返回if (n == 1) {return 9;}int k = (int) Math.pow(10, n) - 1;// 枚举回文左半部分,对应代码中的ifor (int i = k; i >= 1; i--) {long pal = i;int tmp = i;while (tmp > 0) {pal = pal * 10 + tmp % 10;tmp /= 10;}// 回文数不可以超过k的平方if (pal > (long) k * k) {continue;}// 判断pal是否可以拆成两个n位数乘积,因子从k开始,另一个因子一定小于kfor (long j = k; j * j >= pal; j--) {if (pal % j == 0) {return (int) (pal % 1337);}}}return -1;}}
