十四、最大回文数乘积
14.1、题设要求
给定一个整数 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
14.2、解题思路
第一种解法:
先计算最大乘积,再将最大乘积的前半部分数字拿出并使用生成函数生成相应的回文数,然后将生成的回文数进行比较,若没有找到则将数字前半部分数字减一并重新生成新的回文数进行比较,依次循环下去;若找到则输出即可。
第二种解法:
因为此题的范围是固定且比较小的,直接打表即可。
14.3、算法
第一种算法:
class Solution {
public int largestPalindrome(int n) {
//如果n为1,则只有9最大
if (n == 1) {
return 9;
}
//定界限
long upper = (long) Math.pow(10,n) - 1;
long lower = upper/10 + 1;
//范围中的最大乘积
long maxNumber = upper * upper;
//计算最大数字的前半部分
long half = (long) (maxNumber/Math.pow(10,n));
//是否找到
boolean found = false;
//返回值
long result = 0;
//循环找对应的回文数
while (!found){
//调用生成函数
result = create(half);
//从高往低进行查找
for (long i = upper; i >= lower; i--) {
//i*i的值小于result的值
if (i * i < result){
break;
}
//result对i取余为0
if (result % i == 0){
found = true;
break;
}
}
//没找到,接着找前半部分下一位数字
half--;
}
//返回回文数并对1337取余
return (int) (result % 1337);
}
//生成函数
public long create(long number){
//将传来的数字前半部分与翻转生成的前半部分的数字拼接生成新的回文数
String str = number + new StringBuilder().append(number).reverse().toString();
return Long.parseLong(str);
}
}
参考视频:力扣up主郭郭
第二种算法:
class Solution {
public int largestPalindrome(int n) {
int[] palindromes = {
9,987,123,597,677,1218,877,475};
return palindromes[n - 1];
}
}