题目概述
给定一个整数 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
解题分析
方法1:枚举
由 n 可以知道,最大回文数一定是一个 2n 位数,而根据回文数的性质,我们可以利用前一半的数进行枚举,即从 n 位数 开始,不断拼成 2n 位的回文数,然后判断该回文数是否能被拆分为两个 n 位数即可。判断回文数的终止条件可以为 n * n < 拼成的回文数,因为在此之后,不可能两个都为 n 位数。
时间复杂度:O(10^2n)
空间复杂度:O(1)
class Solution {
// 取余数
static final int MOD = 1337;
public int largestPalindrome(int n) {
// n为1,直接返回9
if(n == 1){
return 9;
}
// 定义最大的左边
int left = (int)Math.pow(10, n) - 1;
// 遍历,枚举
for(int i = left; i >= 0; --i){
// 完整数字
long cur = i;
// 拼成完整数字
for(int j = i; j > 0; j /= 10){
cur = cur * 10 + j % 10;
}
// 判断该数字是否能被拆分为两个 n 位数
for(long j = left; j * j >= cur; --j){
if(cur % j == 0){
return (int)(cur % MOD);
}
}
}
return -1;
}
}
方法2:面向用例编程
n 的数量最多为 8,因此我们可以直接写出这个 8 种情况的答案。
时间复杂度:O(1)
空间复杂度:O(C) C 为 8
class Solution {
// 结果集
static final int[] RES = new int[]{9,987,123,597,677,1218,877,475};
public int largestPalindrome(int n){
return RES[n-1];
}
}