问题描述
给定一个整数 n ,返回 可表示为两个 n
位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337
取余 。
示例 1:
输入:n = 2 输出:987 解释:99 x 91 = 9009, 9009 % 1337 = 987示例 2:
输入: n = 1 输出: 9提示:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-palindrome-product
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
基本想法
见下图:
最终枚举对象为:,枚举范围为:
故时间复杂度为,但是实际中都很小,所以实际耗时很短(时,力扣环境下为4ms)
伪代码过程:
range = (1, 10^n); //range of the enumeration
loop(x, range):
left <- 10 ^ n - x;
right <- integer(reverse(string(left)));
judge <- x ^ 2 - 4 * right;
if(judge > 0 and sqrt(judge) is integer):
return (left * 10 ^ n + right) % 1337;
end loop;
return -1;
完整代码(C++)
class Solution {
public:
int largestPalindrome(int n) {
if(n == 1) {
return 9;
}
long n_10 = pow(10, n);
for(long x = 1; x < n_10; x++) {
long left = n_10 - x;
string r = to_string(left);
reverse(r.begin(), r.end());
long right = stoi(r);
long tmp = x * x - 4 * right;
if(tmp < 0) {
continue;
}
long root = sqrt(tmp);
if(root * root == tmp) {
return (left * n_10 + right) % 1337;
}
}
return -1;
}
};
最终结果
还有纯打表的解法这里就不给了,毕竟面向样例编程的也太...哈哈哈哈